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;}