给出一个最短路邻接矩阵,求出构图的最小边数
正常的floyd的k放在最外面是为了防止i到j的距离被提前确定,而逆向的floyd,i到j的距离已经确定,所以需要在i到j之间枚举k
Sample Input
3 3 0 1 1 1 0 1 1 1 0 3 0 1 3 4 0 2 7 3 0 3 0 1 4 1 0 2 4 2 0 Sample Output
Case 1: 6 Case 2: 4 Case 3: impossible
1 #include<stdio.h> 2 const int MAXN=110; 3 int map[MAXN][MAXN]; 4 int ans;//至少需要的边数 5 int n;//点数 6 int Solve() 7 { 8 for(int i=0;i<n;i++) 9 for(int j=0;j<n;j++) 10 for(int k=0;k<n;k++) 11 { 12 if(i!=j&&j!=k&&i!=k) 13 { 14 if(map[i][j]==map[i][k]+map[k][j]) 15 { 16 ans--;//这条边可以不需要的 17 break; 18 } 19 if(map[i][j]>map[i][k]+map[k][j]) 20 return 0;//不可能的情况 21 } 22 } 23 return 1; 24 } 25 int main() 26 { 27 int T; 28 scanf("%d",&T); 29 30 while(T--) 31 { 32 scanf("%d",&n); 33 for(int i=0;i<n;i++) 34 for(int j=0;j<n;j++) 35 scanf("%d",&map[i][j]); 36 37 ans=n*(n-1);//最多的边数 38 if(Solve()) 39 { 40 printf("%d\n",ans); 41 } 42 else printf("impossible\n"); 43 } 44 return 0; 45 }
时间: 2024-12-16 10:55:41