码迷,mamicode.com
首页 > 其他好文 > 详细

96D - Police Stations

时间:2017-09-30 13:28:31      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:ase   pre   problem   def   push   bool   strong   station   stat   

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

标签:ase   pre   problem   def   push   bool   strong   station   stat   

原文地址:http://www.cnblogs.com/widsom/p/7614441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!