HDU 1599 find the mincost route(図floydの最も小さい環に向かって詳しく説明していない)
1630 ワード
転載は出典を明記してください.http://blog.csdn.net/a1dark
分析:やっとfloydの原理が分かりました.以前の理解はずっと浅くて、だからfloyd応用の問題をやり遂げると、拙策になりました.floydの本質DPは前K-1点を利用して、現在の完成した最も小さい輪を求められます.具体的には以下のように実現します.
分析:やっとfloydの原理が分かりました.以前の理解はずっと浅くて、だからfloyd応用の問題をやり遂げると、拙策になりました.floydの本質DPは前K-1点を利用して、現在の完成した最も小さい輪を求められます.具体的には以下のように実現します.
#include<stdio.h>
#include<string.h>
#define N 101
#define INF 0x7ffffff
int mpt[N][N];
int dist[N][N];
int m,n,minc;
int min(int x,int y){
if(x<y) return x;
return y;
}
void floyd(){
minc=INF;
for(int k=1;k<=n;k++){// K-1 K
for(int i=1;i<=k;i++)
for(int j=i+1;j<=k;j++)//
minc=min(minc,dist[i][j]+mpt[i][k]+mpt[k][j]);//K 、
for(int i=1;i<=n;i++)//floyd 、 K-1
for(int j=1;j<=n;j++)
if(dist[i][j]>dist[i][k]+dist[k][j])
dist[i][j]=dist[i][k]+dist[k][j];
}
}
void init(){// 、
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
mpt[i][j]=INF;
dist[i][j]=INF;
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
int s,e,v;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&s,&e,&v);
if(v<mpt[s][e]){
mpt[s][e]=v;
mpt[e][s]=v;
dist[s][e]=v;
dist[e][s]=v;
}
}
floyd();
if(minc<INF)
printf("%d
",minc);
else
printf("It's impossible.
");
}
return 0;
}