山を呼ぶのはトランペットの形をした人で、手を口に当てて、遠くの山に向かって「Hey-hey-hey-hey ...」と呼びかけます。呼び出し音は空中を伝わり、深い谷間に響き渡り、人の耳に伝わり、従来の「信号」を発信して音の伝達とコミュニケーションの目的を果たします。イ族の先祖が助けを求めるために使っていた「合図」だったことがわかり、人々はゆっくりと日常生活の中でその実用的な価値を発見し、世代から世代へのコミュニケーションツールとして使用しました。
隣の山からも山の叫び声が聞こえてきます。タイトルは、各丘にそれを聞くことができる最大2つの近くの丘があることを前提としています。元の信号を送信する丘がある場合、この質問では、この信号が到達できる最も遠い場所を見つけるように求められます。
入力形式:入力の
最初の行は、3つの正の整数n、m、およびkを示します。ここで、n(≤10000)は丘の総数です(したがって、各丘の番号は1からnであると想定します)。次のm行では、各行はnを超えない2つの正の整数を示します。番号はスペースで区切られ、互いに聞こえる2つの丘の番号を表します。ここでは、丘の各ペアが1回だけ入力され、重複する関係の入力がないことが保証されています。最後の行は、nを超えないk(≤10)の正の整数を示します。数値は、照会する山の番号を表すためにスペースで区切られます。
出力形式:
入力内の丘ごとに、呼び出しを1行にチェーンできる最も遠い丘を出力します。注:クエリを実行するには、最初に出力を丘にチェーンする必要があります。そのような丘が複数ある場合は、番号が最も小さい丘が出力されます。この丘の呼び出しが他の丘に到達できない場合、0が出力されます。
入力サンプル:
7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7
サンプル出力:
2
6
4
0
コード:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10050;
int n,m,k,a,b,x,maxd=0,ans=0,d[maxn]; //maxd最远距离,ans为最远编号最小的山
vector<int> g[maxn]; //邻接表
bool vis[maxn]={
false}; //标志是否入队
void bfs(int u)
{
queue<int> q;
q.push(u);
vis[u]=1;
while(!q.empty())
{
int f = q.front();
q.pop();
for(int i=0;i<g[f].size();i++)
{
int v=g[f][i];
if(!vis[v])
{
vis[v]=1;
d[v]=d[f]+1; //更新深度
if(maxd<d[v]) maxd=d[v],ans=v; // 更新最远距离和此时的山
else if(maxd==d[v]) ans=min(ans,v); //最远距离相等,要编号小的山
q.push(v);
}
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
cin>>a>>b;
g[a].push_back(b); //无向边
g[b].push_back(a);
}
for(int i=0;i<k;i++)
{
cin>>x;
ans=maxd=0; //初始化
fill(d,d+maxn,0);
fill(vis,vis+maxn,0);
bfs(x);
cout<<ans<<endl;
}
return 0;
}