#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;
}
hdu2377 Bus Pass
最新推荐文章于 2019-05-28 21:16:15 发布