uva 10048

题意:

求两点之间路径中的最大值值最小,直接floyd

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int mp[105][105],n,m,q;
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            if(mp[i][k]==-1)
                continue;
            for(int j=1;j<=n;j++)
            {
                if(mp[k][j]==-1)
                    continue;
                int temp=mp[i][k]>mp[k][j]?mp[i][k]:mp[k][j];
                if(mp[i][j]==-1||temp<mp[i][j])
                    mp[i][j]=temp;
            }
        }
    }
}
int main()
{
    int cas=1;
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        if(n+m+q==0)
            break;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                mp[i][j]=-1;
            mp[i][i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            mp[x][y]=mp[y][x]=z;
        }
        floyd();
        printf("Case #%d\n",cas);
        while(q--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(mp[x][y]==-1)
                printf("no path\n");
            else
                printf("%d\n",mp[x][y]);
        }
    }
    return 0;
}

  

时间: 2024-11-10 15:13:48

uva 10048的相关文章

UVA - 10048 Audiophobia (Floyd应用)

题意:求出两点之间所有路径最大权值的最小值. 思路:转变一下Floyd的形式即可: 注意:注意初始化问题,还有UVA奇葩的输出形式. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; #define inf 0x3f3f3f int dp[110][110]; int mai

UVA 10048 Audiophobia

简单DP.转移就可以.比较像floyd #include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include

UVa 10048 Audiophobia【Floyd】

题意:给出一个c个点,s条边组成的无向图,求一点到另一点的路径上最大权值最小的路径,输出这个值 可以将这个 d[i][j]=min(d[i][j],d[i][k]+d[k][j]) 改成 d[i][j]=min(d[i][j],max(d[i][k],d[k][j])) 即为先找出最大权值的一条边,再从这些边中找出最小的 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <

UVa 10048 (Floyd变形) Audiophobia

题意: 给一个带权无向图,和一些询问,每次询问两个点之间最大权的最小路径. 分析: 紫书上的题解是错误的,应该是把原算法中的加号变成max即可.但推理过程还是类似的,如果理解了Floyd算法的话,这个应该也很容易理解. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = 100 + 10; 6 const int INF = 1000000000; 7 int

UVA 10048 Audiophobia 【floyd】

题目链接: https://vjudge.net/problem/UVA-10048 中文大意: 现在有一个无向图,有C个点,S个边,Q个询问. 每条边有一个权值代表噪音值.若想从u走到v.选择一条最大噪音尽可能小的路线. 对于每一个询问,输出u到v的路径中,输出路线的最大噪音值是多少. 大致思路: 整体的思路还是floyd,只不过中间的转移方程需要变一下. 原始的floyd是求最短路,更新的时候是当有更短的路径存在. 而在本题中,有更新的条件是发现某个路径上噪音最大值小于当前存储的值时,更新此

uva 10048 - Audiophobia(floyd 的变形)

给出一个无向连通图以及边权,目的求从一个点到另一个点的路径中 边权最大值 最小的那条路径,输出的是该条路径的最大边权. 因为是两点间路径问题,且数据量很小(只有100个) ,所以考虑使用floyd算法. 但是要求的并不是传统 floyd 所求的 两点之间最短路 问题,但是通过理解floyd算法的原理,可以发现floyd的思想可以用来解决这种问题: 对于任何一条至少包含两条边的路径i->j,一定存在一个中间点k,使得i->j的总长度等于i->k与k->j的长度之和.因为路径可能有多个

uva 10048 Audiophobia UVA - 10048

题目简介 一个无向正权图,求任意两个节点之间的路径里最短的路径长度. 直接Floyd解决,就是注意要把Floyd的DP式子改一下成 G[i][j]=min(G[i][j],max(G[i][k],G[k][j]));还有无向图要双向赋值 代码 #include <bits/stdc++.h> using namespace std; int G[110][110]; int main() { int n,m,t,cnt=0; while(cin>>n>>m>>

第11章例题(紫书)

10/15 这几天先专心刷一下图论的基础题目,也蛮多的,慢慢来... 例题11-1 uva 12219 题意:给你一个表达式,然后又一些子树在之前重复出现过,先要你给这些子树出现的顺序编个号1...N,然后如果重复出现就用编号替代,输出替代之后的表达式. 题解:这是一个表达式树的问题,显示建树,如果让我来写的话,很麻烦,搞不好复杂度是O(n^2),因为字符串是一直扫描下去的,所以就利用一个指针作为全局,然后一直扫下去,就忽略一个左括号,建左树,然后忽略逗号,建右树,忽略右括号,然后一直扫下去,就

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d