思路: 用bfs搜索, 一层一层搜索。因为没有路径,可以看作路径为一, 所以在队列结束的前一层是最远距离,只需记录下最小的编号就好了。
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <functional>
#include <stack>
#include <stdio.h>
#define INIF 1000000
using namespace std;
int g[10001][2];
int main()
{
int n,m,k;
int minid;
int v;
bool flag[10001];
queue<int> q[2];
cin >> n >> m >> k;
memset(g,0,sizeof(g));
memset(flag,0,sizeof(flag));
for(int i = 0; i < m; i++)
{
int v1,v2;
cin >> v1 >> v2;
if(g[v1][0] == 0)
g[v1][0] = v2;
else
g[v1][1] = v2;
if(g[v2][0] == 0)
g[v2][0] = v1;
else
g[v2][1] = v1;
}
// for(int i = 1; i <= n; i++)
// {
// cout << i << " " << g[i][0] << " " << g[i][1] << endl;
// }
int a,b;
for(int i = 0; i < k; i++)
{
minid = INIF;
a = 1;
b = 0;
memset(flag,0,sizeof(flag));
cin >> v;
q[a].push(v);
flag[v] = 1;
while(!q[a].empty())
{
minid = INIF;
while(!q[a].empty())
{
int top;
top = q[a].front();
q[a].pop();
// cout << top << " ";
minid = min(minid,top);
if(!flag[g[top][0]] && g[top][0] != 0)
{
q[b].push(g[top][0]);
flag[g[top][0]] = 1;
}
if(!flag[g[top][1]] && g[top][1] != 0)
{
q[b].push(g[top][1]);
flag[g[top][1]] = 1;
}
}
// cout << endl;
swap(a,b);
}
if(minid == v)
cout << 0 << endl;
else
cout << minid << endl;
}
}
反思: 隐藏判断条件的总是被忽略。