hdu 4034(floyd)

题目大意:给出一个地图,已知每两个点之间的最短路径,求原图最少有多少条边。

从给定的图中选择边,如果一条边等于其余两边之和,把该边标记为一个很大的数(即删除)

如果一条边比另外两条边大,则输出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;
}

猜你喜欢

转载自blog.csdn.net/l2533636371/article/details/80175803
今日推荐