思路: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; }
时间: 2024-10-18 05:51:31