标签:style blog class code c tar
一道简单的倒着的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
标签:style blog class code c tar
原文地址:http://www.cnblogs.com/laiba2004/p/3728673.html