uva567 - Risk(Risk游戏)

Floyd算法的简单应用,,

只不过这个题描述图的方法有点不好懂。

对于第i行,第一个数字n只是代表这一行还有多少数字要输入,说明节点i和接下来的n个节点都有路径。

例如第四行 【1 6】   ::表示节点4和节点6有路径,前面的1只是说明这一行上接下来有多少个数字。

代码如下:

#include <cstdio>
#define INF 1000000
int d[21][21];
int read_draph()
{
    int b, n;
    for(int i = 1; i <= 20; i++) for(int j = 1; j <= 20; j++)
        if(i==j) d[i][j] = 0;
        else d[i][j] = INF;
    for(int i = 1; i <= 19; i++)
    {
        if(scanf("%d",&n)==EOF) return 0;
        for(int j = 0; j < n; j++) {scanf("%d",&b); d[i][b] = d[b][i] = 1;}
    }
    return 1;
}
void flord()
{
    for(int i = 1; i <= 20; i++)
        for(int j = 1; j <= 20; j++)
            for(int k = 1; k <= 20; k++)
                if(d[j][k]>d[j][i]+d[i][k]) d[j][k] = d[j][i]+d[i][k];
}
int main ()
{
    int t = 0;
    while(read_draph())
    {
        int a, b;
        flord();
        int n;
        printf("Test Set #%d\n",++t);
        scanf("%d",&n);
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d",&a,&b);
            printf("%2d to %2d: %d\n",a,b,d[a][b]);
        }
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(uva567 - Risk(Risk游戏))