题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4034
不断去除边,判断有没有从i到k的距离加上k到j的距离等于i到j的距离,如果存在说明i j边多余,去掉
如果impossible 存在i到k的距离加上k到j的距离小于i到j的距离,矛盾了
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 150
int n,map[maxn][maxn];
int find_ans(){
int i,j,k,ans=n*(n-1);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++){
if(i!=j && i!=k && j!=k && map[i][k]+map[k][j] < map[i][j]){
printf("impossible\n");
return 0;
}
if(i!=j && i!=k && j!=k&&map[i][k]+map[k][j]==map[i][j]){
ans--;
break;
}
}
printf("%d\n",ans);
return 0;
}
int main(){
int k=0,i,j,t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
printf("Case %d: ",++k);
find_ans();
}
return 0;
}