vijos 无向图最短路径 思维

无向图最短路径问题,是图论中最经典也是最基础的问题之一。本题我们考虑一个有 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

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;
}

你可能感兴趣的:(思维)