一道简单的倒着的floyd。
具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;const int MAXN=110;
const int INF=0x3f3f3f3f;//防止后面溢出,这个不能太大
bool vis[MAXN];
int pre[MAXN], cost[MAXN][MAXN],lowcost[MAXN];
void Dijkstra(int n,int beg) {
int i,j;
for(i=0;i<n;i++)
lowcost[i]=INF,vis[i]=false,pre[i]=-1;
lowcost[beg]=0;
for( j=1;j<=n;j++) {
int k=-1;
int Min=INF;
for(i=0;i<n;i++)
if(!vis[i]&&lowcost[i]<Min)
Min=lowcost[i],k=i;
if(k==-1)break;
vis[k]=true;
for(i=0;i<n;i++)
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
lowcost[i]=lowcost[k]+cost[k][i],pre[i]=k;
}
}
int main()
{
int t,n,i,j,ans,k;
scanf("%d",&t);
for(int id=1;id<=t;id++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&cost[i][j]);
}
}int flag=0;
for(i=0;i<n;i++)
{
Dijkstra(n,i);
for(j=0;j<n;j++)
{
if(lowcost[j]!=cost[i][j])
{
flag=1;
break;
}
}
if(flag==1)break;
}
printf("Case %d: ",id);
if(flag==1)
{
printf("impossible\n");
}
else
{
ans=0;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(cost[i][j]==cost[i][k]+cost[k][j]&&i!=j&&k!=i&&k!=j)
{
cost[i][j]=INF;
}
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(!(cost[i][j]==0||cost[i][j]==INF))
{
ans++;
}
}
}
printf("%d\n",ans);
}
}
return 0;
}
HDU 4034 Graph(floyd,最短路,简单),布布扣,bubuko.com