floyd 最短路算法

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#define N 25
#define INF 10000

using namespace std;
int dp[N][N];
int n,m,a,b;
void floyd()
{
    for(int k=1; k<=20; ++k)
    {
        for(int i=1; i<=20; ++i)
        {
            for(int j=1; j<=20; ++j)
            {
                dp[i][j]=min(dp[i][j], dp[i][k]+dp[k][j]);
            }
        }
    }
}
int main()
{
    int cas=0;
    while(scanf("%d",&n)==1)
    {
        for(int i=0; i<=20; ++i)
        {
            for(int j=0; j<=20; ++j)
            {
                if(i!=j) dp[i][j]=INF;
                else dp[i][j]=0;
            }
        }
        for(int i=0; i<n; ++i)
        {
            scanf("%d",&a);
            dp[1][a]=dp[a][1]=1;
        }
        for(int i=2; i<20; ++i)
        {
            scanf("%d",&n);
            for(int j=0; j<n; ++j)
            {
                scanf("%d",&b);
                dp[i][b]=dp[b][i]=1;
            }
        }
        floyd();
        scanf("%d",&m);
        printf("Test Set #%d\n",++cas);
        for(int i=0; i<m; ++i)
        {
            scanf("%d %d",&a,&b);
            printf("%2d to %2d: %d\n",a,b,dp[a][b]);
        }
        puts("");
    }
    return 0;
}
View Code

 

posted on 2013-10-10 18:18  风流monkey  阅读(137)  评论(0编辑  收藏  举报