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

CF796D Police Stations BFS+染色

时间:2019-10-03 12:33:23      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:ons   using   highlight   empty   push   NPU   nbsp   add   ret   

类似贪心,用 BFS 对树进行染色,然后枚举哪些边的两个端点颜色不同. 

code: 

#include <bits/stdc++.h>
#define N 300006 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std; 
vector<int>G;  
queue<int>q;   
int n,k,d,edges,vis[N],hd[N],to[N<<1],nex[N<<1],U[N],V[N],dis[N];     
void add(int u,int v) 
{
    nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; 
}
int main() 
{
    int i,j; 
    // setIO("input"); 
    scanf("%d%d%d",&n,&k,&d); 
    for(i=1;i<=k;++i) 
    {
        int x; 
        scanf("%d",&x); 
        vis[x]=x,q.push(x); 
    }  
    for(i=1;i<n;++i) 
    {
        int u,v; 
        scanf("%d%d",&u,&v), add(u,v),add(v,u);  
        U[i]=u, V[i]=v; 
    }
    for(;!q.empty();) 
    {
        int u=q.front();q.pop();          
        for(int i=hd[u];i;i=nex[i]) 
        {
            int v=to[i]; 
            if(!vis[v] && dis[u]+1<=d) 
            {
                vis[v]=vis[u]; 
                dis[v]=dis[u]+1;     
                q.push(v);  
            }
        }
    }   
    for(i=1;i<n;++i) 
    {
        if(vis[U[i]]!=vis[V[i]])  
        {
            G.push_back(i); 
        }
    }
    printf("%d\n",G.size()); 
    for(i=0;i<G.size();++i) printf("%d ",G[i]); 
    return 0; 
}

  

CF796D Police Stations BFS+染色

标签:ons   using   highlight   empty   push   NPU   nbsp   add   ret   

原文地址:https://www.cnblogs.com/guangheli/p/11619417.html

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