HDU 1599 find the mincost route(Floyd最小环)

来源:互联网 发布:福岛核事故 知乎 编辑:程序博客网 时间:2024/05/17 08:28
#include<iostream>#include<cstring>#include<cstdio>#define inf 0x7ffffffusing namespace std;const int N=100+5;int map[N][N],dis[N][N];int floyd(int n){int Min=inf;for(int k=1;k<=n;k++){for(int i=1;i<k;i++)//最小环(最大的为k) {for(int j=i+1;j<k;j++)//不走回头路(无向图) {int temp=dis[i][j]+map[i][k]+map[k][j];if(temp<Min){Min=temp;}}}for(int i=1;i<=n;i++)//最短路A(k-1) {for(int j=1;j<=n;j++){if(dis[i][j]>dis[i][k]+dis[k][j]){dis[i][j]=dis[i][k]+dis[k][j];}}}}//?先更新最小环再更新最短路?//更新最小环的时候要使i-->j的最短路中没有k点,//如果先更新了最短路,则i-->j的最短路中可能含有k点。 return Min;}int main(){int n,m;while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=dis[i][j]=inf;}}for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);if(w<map[u][v])//如果两点之间有多条路,直接取最短的路 map[u][v]=map[v][u]=dis[u][v]=dis[v][u]=w;}int s=floyd(n);if(s==inf) printf("It's impossible.\n");else printf("%d\n",s);}return 0;}

0 0
原创粉丝点击