题目大意:给出一个地图,已知每两个点之间的最短路径,求原图最少有多少条边。
从给定的图中选择边,如果一条边等于其余两边之和,把该边标记为一个很大的数(即删除)
如果一条边比另外两条边大,则输出impossible;
#include<stdio.h> using namespace std; #define INF 0x7ffffff int mp[115][115]; int n; int floyd(){ int sum=0; for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++){ if (i==j||j==k||i==k)continue; if(mp[i][j]==mp[i][k]+mp[k][j]){ sum++; mp[i][j]=INF; } else if(mp[i][j]>mp[i][k]+mp[k][j]&&mp[i][j]!=INF){ return -1; } } return sum; } int main() { int t; int Kase=1; scanf("%d",&t); while(t--) { scanf("%d",&n); int nn=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { scanf("%d",&mp[i][j]); if(mp[i][j]!=0) nn++; } int sum=floyd(); printf ("Case %d: ",Kase++); if(sum==-1) printf ("impossible\n"); else printf("%d\n",nn-sum); } return 0; }