hdu2377 Bus Pass

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
/*
参考大神代码写的;
惭愧啊!
*/

using namespace std;

const int M = 10000;

int vist[M];
int dist[M];
vector<int>mmap[M];
int route[M];
int cnt;
struct node {

    int id;
    int sum;
};
int T, n, m;
int city[M];

void bfs(int s1) {

    queue<node>que;
    node cur, next;
    cur.id = s1;
    cur.sum = 1;
    que.push(cur);
    vist[s1] = 1;
    while(!que.empty()) {

        cur = que.front();
        que.pop();
        if(dist[cur.id] < cur.sum) {//为获得满足所有点到此点的最小距离中的最大距离;一次完成对所有点的距离;
                                      //非常好;
            dist[cur.id] = cur.sum;
        }
        for(int i = 0; i < mmap[cur.id].size(); i++) {

            int u = mmap[cur.id][i];
            if(!vist[u]) {

                next.id = u;
                next.sum = cur.sum + 1;
                que.push(next);
                vist[u] = 1;
            }
        }

    }
}

int main()
{
    int a, s, b, lu, num;
    scanf("%d", &T);
    while(T--) {

        for(int i = 0; i < M; i++) {

            mmap[i].clear();
        }
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++) {

                scanf("%d%d", &s, &a);
                city[i] = s;
          for(int j = 1; j <= a; j++) {

              scanf("%d", &b);
             mmap[s].push_back(b); //建立双向连通图;
             mmap[b].push_back(s);
          }
        }
        cnt = 1;
        int k;
        for(int i = 1; i <= m; i++) {
            scanf("%d", &num);
            for(int j = 1; j <= num; j++) {

                scanf("%d", &lu);
                for(k = 1; k < cnt; k++) { //

                    if(lu == route[k])
                        break;
                }
                if(cnt == k){

                    route[cnt++] = lu;
                }
            }
        }
        memset(dist, 0, sizeof(dist));
        for(int i = 1; i < cnt; i++) {
            for(int j = 1; j <= n; j++)
                vist[city[j]] = 0;
            bfs(route[i]);
        }
        dist[0] = 99999999;
        int ans = 0;
        for(int i = 1; i < n; i++) {

            if(dist[city[i]] < dist[ans]) {

                ans = city[i];
            }
            else if(dist[city[i]] == dist[ans]) {

                if(city[i] < ans)
                    ans = city[i];
            }
        }
        printf("%d %d\n", dist[ans], ans);

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值