POJ 1125 Stockbroker Grapevine floyd多源最短路,选取一个点,使最大边的权值是最小的

来源:互联网 发布:身份证核查软件 编辑:程序博客网 时间:2024/04/28 06:14

第一个输出选取的点,然后在输出选取的点到所有边的权值中最大的。

选点如何选择??? 一个点到其余所有点的边都有一个最大值,这个最大值最小即可

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#define inf 0x3f3f3f3fusing namespace std;int d[110][110];void init(int n){    int i, j;    for(i = 1;i <= n;i++){        for(j = 1;j <= n;j++){            if(i == j)                d[i][j] = 0;            else                d[i][j] = inf;        }    }}void floyd(int n){    int i, j, k;    for(k = 1;k <= n;k++)        for(i  =1;i <= n;i++)            for(j =1;j <= n;j++)                if(d[i][j] > d[i][k] + d[k][j])                    d[i][j] = d[i][k] + d[k][j];}int main(){    int n, m;    int a, b;    int i, j;    while(cin >> n){        if(n == 0)  break;        init(n);        for(i =  1;i <= n;i++){            cin >> m;            while(m--){                cin >> a >> b;                if(d[i][a] > b)                    d[i][a] = b;            }        }        floyd(n);        int temp;        int ans = inf;        int t;        for(i = 1;i <= n;i++){            temp = 0;            for(j = 1;j <= n;j++){                if(i != j&&d[i][j] > temp){//temp表示i这个点到其余各点的边中最大值                    temp = d[i][j];                }            }            if(temp < ans){//选取最大值中最小的那个值,并将此点记住                ans = temp;                t = i;            }        }        printf("%d %d\n", t, ans);    }    return 0;}


0 0
原创粉丝点击