hdu2377 Bus Pass

来源:互联网 发布:ie11浏览器mac 编辑:程序博客网 时间:2024/05/28 06:06
#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;}

原创粉丝点击