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; 
}

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/11619417.html