UVa 567 - Risk

比较简单的一个题,但题目描述搞得比较混乱。

题意:先输入19行,每行先是一个数字J,接着跟着J个数字,输入的每个数字x表示行数i与x两点是联通的(且距离为1)。随后再输入一个数字n,紧跟着n行,每行输入一个出发点和目的地点,输出两个点之间的最小距离。

直接用Floyd算法套模板搞定。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;
int vis[21][21];
const int INF = 50;
void floyd()
{
    for(int k=1; k<=20; k++)
        for(int i=1; i<=20; i++)
            for(int j=1; j<=20; j++)
                vis[i][j] = min(vis[i][j], vis[i][k] + vis[k][j]);
}
int main()
{
#ifdef test
    freopen("sample.txt", "r", stdin);
#endif
    int num, x, y, cas = 0;
    while(scanf("%d", &num) != EOF)
    {
        for(int i=1; i<21; i++)
            for(int j=1; j<21; j++)
            {
                if(i == j)
                    vis[i][j] = 0;
                else
                    vis[i][j] = INF;
            }
        for(int j=0; j<num; j++)
        {
            scanf("%d", &x);
            vis[1][x] = vis[x][1] = 1;
        }
        for(int i=2; i<20; i++)
        {
            scanf("%d", &num);
            for(int j=0; j<num; j++)
            {
                scanf("%d", &x);
                vis[i][x] = vis[x][i] = 1;
            }
        }
        floyd();
        scanf("%d", &num);
        printf("Test Set #%d\n", ++cas);
        for(int i=0; i<num; i++)
        {
            scanf("%d%d", &x, &y);
            printf( "%2d to %2d: %d\n", x, y, vis[x][y]);
        }
        puts("");
    }
    return 0;
}


你可能感兴趣的:(UVa 567 - Risk)