生活随笔
收集整理的這篇文章主要介紹了
中石油训练赛 - Equidistant(bfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一棵 n 個點的樹,再給出 m 個關鍵點,問是否存在著一個點到 m 個關鍵點的距離都相同,存在的話輸出任意一個即可
題目分析:bfs 按層展開維護貢獻就好了,記錄一下每個點在同一層最多被多少個關鍵點覆蓋
代碼:
?
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;bool vis[N];int n,m,deep[N],num[N];vector<int>node[N];void bfs()
{queue<int>q;for(int i=1;i<=n;i++)if(vis[i]){q.push(i);deep[i]=1;num[i]=1;}while(q.size()){int u=q.front();q.pop();for(auto v:node[u])if(deep[v]==0||deep[v]==deep[u]+1){num[v]+=num[u];if(!vis[v]){vis[v]=true;deep[v]=deep[u]+1;q.push(v);}}}
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}for(int i=1;i<=m;i++){int x;scanf("%d",&x);vis[x]=true;}bfs();for(int i=1;i<=n;i++)if(num[i]>=m){puts("YES");printf("%d\n",i);goto end;}puts("NO");end:;return 0;
}
?
總結
以上是生活随笔為你收集整理的中石油训练赛 - Equidistant(bfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。