poj 1603 Risk 最短路

题意:给出20个国家的连接情况,然后求出连接2个目标国家的最少边数。
算法:转化为最短路问题。将每条边的权值设为1,“最少边数”即等价为“最短路”

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define re1(i,n) for(int i=1;i<=n;i++)
const int maxn = 21;
int map[maxn][maxn];
int main() {
    int n , m;
    int cas = 1;
    while(~scanf("%d",&n)) {
        re1(i,20) re1(j,20) map[i][j] = 100;
        while(n--) {
            scanf("%d",&m);
            map[1][m] = map[m][1] = 1;
        }
        for(int i=2;i<20;i++) {
            scanf("%d",&n);
            while(n--) {
                scanf("%d",&m);
                map[i][m] = map[m][i] = 1;
            }
        }
        re1(k,20) re1(i,20) re1(j,20)
            if(map[i][k] + map[k][j] < map[i][j])
                map[i][j] = map[i][k] + map[k][j];
        scanf("%d",&n);
        printf("Test Set #%d\n",cas++);
        while(n--) {
            int u , v;
            scanf("%d%d",&u,&v);
            printf("%d to %d: %d\n",u,v,map[u][v]);
        }
        printf("\n");
    }
    return 0;
}
posted @ 2012-07-04 04:28  lenohoo  阅读(186)  评论(0)    收藏  举报