96D - Police Stations

Posted Wisdom+.+

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了96D - Police Stations相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3663 Power Stations

UVA 10160 Servicing Stations(状态压缩+迭代加深)

ZOJ-3820 Building Fire Stations 题解

numa_police_memory

Parsley JS 强制字段验证状态失败

Power Stations HDU - 3663