96D - Police Stations
Posted Wisdom+.+
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了96D - Police Stations相关的知识,希望对你有一定的参考价值。
思路:bfs,从所有的警察局开始bfs,因为bfs的深度一样,而且题目给的树保证满足条件,所以不用考虑深度。
如果搜索到一个点a,他的下一个点b已经被搜索过了,而且a到b这条路没有被走过,那么这条路可以被砍掉。
不能用dfs,这样可能导致某些点搜索不到,反例读者自己找。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=3e5+5; bool vis[N]={false}; bool vs[N]={false}; vector<int>g[N]; vector<int>edge[N]; vector<int>ans; int n,k,d,a,u,v; queue<int>q; void bfs() { int now; int nxt; while(!q.empty()) { now=q.front(); q.pop(); for(int i=0;i<g[now].size();i++) { if(!vis[g[now][i]])vis[g[now][i]]=true,vs[edge[now][i]]=true,q.push(g[now][i]); else if(!vs[edge[now][i]])ans.pb(edge[now][i]); } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>k>>d; for(int i=0;i<k;i++)cin>>a,vis[a]=true; for(int i=0;i<n-1;i++)cin>>u>>v,g[u].pb(v),g[v].pb(u),edge[v].pb(i+1),edge[u].pb(i+1); for(int i=1;i<=n;i++)if(vis[i])q.push(i); bfs(); sort(ans.begin(),ans.end()); ans.erase(unique(ans.begin(),ans.end()),ans.end()); cout<<ans.size()<<‘\n‘; for(int i=0;i<ans.size();i++)cout<<ans[i]<<‘ ‘; cout<<‘\n‘; return 0; }
以上是关于96D - Police Stations的主要内容,如果未能解决你的问题,请参考以下文章
UVA 10160 Servicing Stations(状态压缩+迭代加深)