美文网首页
(Floyd, Kruskal)UVa 10048 - Audi

(Floyd, Kruskal)UVa 10048 - Audi

作者: laochonger | 来源:发表于2018-04-17 15:44 被阅读0次

    转自 https://blog.csdn.net/shuangde800/article/details/7985085

    题目大意:

    从a点到b点, 找到一条路径,使得这条路径上的所有噪音中最大的值是所有路径中最小的, 这个噪音值便是要求的。

    分析与总结:

    用floyd是找出所有路径中长度最小的,只需要稍微变形一下,便可求得答案。

    除了用这个方法,还可以用Kruskal算法,按照Kruskal算法的步骤,一条边一条边的加入树中,每加入一次,就判断所有要问的起点和终点是否已经连通, 一旦有连通的,那么那条路径中的最大值便是当前加入的这条边的权值,因为加入的边是按照从小到大顺序加入的。

    #include<cstdio>    
    #include<cstring>    
    #include<algorithm>    
    const int N = 105;  
    const int INF = 1000000000;  
    using namespace std;  
    int d[N][N], n, m, Q;  
      
    inline void read_graph(){  
        for(int i=1; i<N; ++i){  
            d[i][i] = INF;   
            for(int j=i+1; j<N; ++j)  
                d[i][j]=d[j][i]=INF;  
        }  
        int a,b,c;  
        for(int i=0; i<m; ++i){  
            scanf("%d%d%d",&a,&b,&c);  
            d[a][b]=d[b][a]=c;  
        }  
    }  
    inline void Floyd(){  
        for(int k=1; k<=n; ++k){  
            for(int i=1; i<=n; ++i){  
                for(int j=1; j<=n; ++j){  
                    int tmp = max(d[i][k], d[k][j]);  
                    d[i][j] = min(d[i][j], tmp);  
                }  
            }  
        }  
    }  
    inline void output(){  
        int u,v;  
        for(int i=0; i<Q; ++i){  
            scanf("%d%d",&u,&v);  
            if(d[u][v]!=INF) printf("%d\n",d[u][v]);  
            else printf("no path\n");  
        }  
    }  
      
    int main(){  
        int a,b,c,cas=1;  
        while(~scanf("%d%d%d",&n,&m,&Q)){  
            if(!n&&!m&&!Q) break;  
            read_graph();  
            Floyd();  
            if(cas!=1) puts("");  
            printf("Case #%d\n",cas++);  
            output();  
        }  
        return 0;  
    }  
    

    相关文章

      网友评论

          本文标题:(Floyd, Kruskal)UVa 10048 - Audi

          本文链接:https://www.haomeiwen.com/subject/zrqpkftx.html