hdu4034Graph

View Code
/*hdu4034Graph
给出任意两点的最短距离,求出图中最少边数,如果这样的图不存在输出impossible
1.floyd去松弛每条边,如果能松弛,则不合理。
2.floyd判断d[i][j]能否表示为d[i][k]+d[k][j]的形式,这样就可以去掉一条边了(假设开始所有顶点间都有边)。
3.ans=n*(n-1)-cnt. 即总边数-可以去掉的边。
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 105
#define INF 1000000000
int d[MAXN][MAXN],vis[MAXN][MAXN],tot;
int main()
{
int cas,n,Cas=0;;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
tot=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&d[i][j]);
}
int OK=1;
memset(vis,0,sizeof(vis));
for(int k=1;k<=n;k++)//floyed任意两点的最短距离
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(d[i][j]>d[i][k]+d[k][j]){OK=0;}
else if(i!=k&&k!=j&&d[i][j]==d[i][k]+d[k][j]&&!vis[i][j])
{
tot++;
vis[i][j]=1;
}
}
printf("Case %d: ",++Cas);
if(OK)printf("%d\n",n*(n-1)-tot);
else printf("impossible\n");
}
}

原文地址:https://www.cnblogs.com/sook/p/2226439.html