一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方。
输入格式:
输入第一行给出3个正整数n
、m
和k
,其中n
(≤10000)是总的山头数(于是假设每个山头从1到n
编号)。接下来的m
行,每行给出2个不超过n
的正整数,数字间用空格分开,分别代表可以听到彼此的两个山头的编号。这里保证每一对山头只被输入一次,不会有重复的关系输入。最后一行给出k
(≤10)个不超过n
的正整数,数字间用空格分开,代表需要查询的山头的编号。
输出格式:
依次对于输入中的每个被查询的山头,在一行中输出其发出的呼喊能够连锁传达到的最远的那个山头。注意:被输出的首先必须是被查询的个山头能连锁传到的。若这样的山头不只一个,则输出编号最小的那个。若此山头的呼喊无法传到任何其他山头,则输出0。
输入样例:
7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7
输出样例:
2 6 4
0
本来想用优先队列来着,想了半天还不如直接用老套路-_-!
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #include <vector> using namespace std; #define PI 3.1415926535897932 #define E 2.718281828459045 #define INF 0x3f3f3f3f #define mod 123456789 #define N 70 typedef long long ll; const int M=1005; int n,m; int cnt; int sx,sy,sz; int mp[M][12]; int pa[M],rankk[M]; int head[M*6],vis[M*10]; double dis[M][10]; ll prime[M*1000]; bool isprime[M*1000]; int lowcost[M],closet[M]; char st1[5050],st2[5050]; int len[M*6]; typedef pair<int ,int> ac; vector<int> g[M*10]; int dp[2005][2005]; bool has[10000]; int month[13]= {0,31,59,90,120,151,181,212,243,273,304,334,0}; int dir[8][2]= {{0,1},{0,-1},{-1,0},{1,0},{1,1},{1,-1},{-1,1},{-1,-1}}; bool isrun(int year) { if((year%4==0&&year%100!=0)||(year%400==0)) return true; return false; } void getpri() { ll i; int j; cnt=0; memset(isprime,false,sizeof(isprime)); for(i=2; i<1000000LL; i++) { if(!isprime[i])prime[cnt++]=i; for(j=0; j<cnt&&prime[j]*i<1000000LL; j++) { isprime[i*prime[j]]=1; if(i%prime[j]==0)break; } } } ll qk_mul(ll a,ll b,ll mo) { ll t=0; while(b) { if(b&1) t=(t+a)%mo; a=(a<<1)%mo; b>>=1; } t%=mo; return t; } ll qk_mod(ll a,ll b,ll mo) { ll ans=1; while(b) { if(b&1) ans=qk_mul(ans,a,mo); a=qk_mul(a,a,mo); b>>=1; } ans%=mo; return ans; } int gcd(int a,int b) { return b == 0 ? a : gcd(b, a%b); } int bfs(int x) { int minx=x,mindis=0;//最小节点和最短距离 queue<ac> qu; qu.push(ac(x,0)); vis[x]=1; while(!qu.empty()) { ac u=qu.front(); int z=u.first; int y=u.second; qu.pop(); if(mindis==y) { minx=min(z,minx); } if(mindis<y) { mindis=y; minx=z; } for(int i=0;i<g[z].size();i++) { //minx=INF; int v=g[z][i]; if(!vis[v]) { //minx=min(v,minx); vis[v]=1; qu.push(ac(v,y+1)); } } } if(mindis==0) return 0; return minx; } int main() { int i,j,t,k; int u,v; scanf("%d%d%d",&n,&m,&k); for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } int ans; for(i=0;i<k;i++) { memset(vis,0,sizeof(vis)); scanf("%d",&u); ans= bfs(u); printf("%d\n",ans); } return 0; }