CF796D Police Stations BFS+染色

Posted guangheli

tags:

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

类似贪心,用 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+染色的主要内容,如果未能解决你的问题,请参考以下文章

CF1215F Radio Stations

cf 1275F Radio Stations

[CF762E]Radio stations

cf 853 D Michael and Charging Stations [dp]

CodeForces 796D

CodeForces 796D bfs