首页 > 代码库 > HDU 4034 Graph(floyd,最短路,简单)
HDU 4034 Graph(floyd,最短路,简单)
题目
一道简单的倒着的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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。