标签:
#include <stdio.h>#define MAX 10000int path[MAX][MAX];bool sign[MAX][MAX];int ans;int n;int floyd(){for(int k=1; k<=n; k++)for(int i=1; i<=n; i++)for(int j=1; j<=n; j++){if(i!=j && i!=k && k!=j) //自己与自己的边不存在{if(path[i][j] > path[i][k] + path[k][j]) //因为不可能再次出现最短路径所以一旦出现就是错误return -1;else if(path[i][j] == path[i][k] + path[k][j] && !sign[i][j]) //还需要判断是否计算过{ans--; sign[i][j] = true;} //重边可以去掉一个}}}int main(){//freopen("read.txt", "r", stdin);int T;scanf("%d", &T);int co = 1;while(T--){printf("Case %d: ", co++);scanf("%d", &n);for(int i=1; i<=n; i++)for(int j=1; j<=n; j++){scanf("%d", &path[i][j]); sign[i][j] = false;}ans = n*(n-1); //每个点到其它顶点的最多的边数,因为是有向的if(floyd() == -1)printf("impossible\n");elseprintf("%d\n", ans);}return 0;}
标签:
原文地址:http://www.cnblogs.com/sober-reflection/p/e79e42884ffbe4d544b9fe3953432e3c.html