1. 程式人生 > >96D - Police Stations

96D - Police Stations

ace sort ces esp problems http sof nbsp namespace

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