vijos 无向图最短路径 思维

来源:互联网 发布:雷克萨斯rx200t 知乎 编辑:程序博客网 时间:2024/06/06 18:00

无向图最短路径问题,是图论中最经典也是最基础的问题之一。本题我们考虑一个有 n 个结点的无向图 G。
G 是简单完全图,也就是说 G 中没有自环,也没有重边,但任意两个不同的结点之间都有一条带权的双向边。
每一条边的边权是非负实数,但我们并不知道每一条边的具体边权。
好消息是我们知道 G中任意两点最短路径的长度d(i,j)。且保证至少有一种边权的分配方案满足得到的带权图中ii与jj的最短路长度恰好是d(i,j)。
下面是留给你的任务:对于任意一对点(i,j),希望你能找出来所有合法的边权分配方案中ii和jj之间边权的最大值。

思路:
考虑n个点的无向图任意两点之间什么情况下边权是一定的,那么肯定就是当不存在第三个点k 使得 d(i,j) = = d(i,k)+d(k,j),那么i,j之间最大值只能为 d(i,j) ,否则如果存在第三点满足上述条件那么i,j之间路径不定.

#include<bits/stdc++.h>using namespace std;const int maxn = 1e2+5;const int inf = 0x3f3f3f3f;int book[maxn][maxn],mp[maxn][maxn];int main(){    int _,n;    cin>>_;    while(_--)    {        memset(mp,0,sizeof mp);        scanf("%d",&n);        for(int i = 1;i <= n;++i)        {            for(int j = 1;j <= n;++j)            {                scanf("%d",&book[i][j]);            }        }        for(int k = 1;k <=n ;++k)        {            for(int i = 1;i <= n;++i)            {                if(i == k) continue;                for(int j = 1;j <= n;++j)                {                    if(i == j ||  k == j) continue;                    if(book[i][j] == book[i][k] + book[k][j])                    {                        mp[i][j] = 1;                    }                }            }        }        for(int i = 1;i <= n;++i)        {            for(int j = 1;j <= n;++j)            {                if(i == j)                {                    printf("0 ");                    continue;                }                if(mp[i][j] == 1)                printf("infty");                else                printf("%d",book[i][j]);                printf(" ");            }            puts("");        }    }    return 0;}
原创粉丝点击