HDU 1599 find the mincost route(図floydの最も小さい環に向かって詳しく説明していない)

1630 ワード

転載は出典を明記してください.http://blog.csdn.net/a1dark
分析:やっと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; }