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

  

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

时间: 2024-10-13 18:42:06

CF796D Police Stations BFS+染色的相关文章

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

XMU 1617 刘备闯三国之汉中之战 【BFS+染色】

1617: 刘备闯三国之汉中之战 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 6  Solved: 5[Submit][Status][Web Board] Description 刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代.刘备一生极具传奇色彩,早年颠沛流离.备尝艰辛最终却凭借自己的谋略终成一方霸主.那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们

UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

题目链接:点击打开链接 gg..== #include <cstdio> #include <cstring> #include<iostream> #include <queue> #include <set> #include <map> #include <algorithm> #include <string> using namespace std; #define ll long long #def

UVALive 3977 BFS染色

这个题意搞了半天才搞明白 就是如果定义一个d-summit,即从该点到另一个更高的点,经过的路径必定是比当前点低至少d高度的,如果该点是最高点,没有比他更高的,就直接视为顶点 其实就是个BFS染色,先按降序排序,然后每个点对其可到达的点染色,h-d的点为边界,走到这里就不用往下染了 然后其他店染色的时候若产生冲突,则非d—summit,否则该点为顶点 今天还有COJ上一个BFS染色的题目,一直TLE...还没弄出来 #include <iostream> #include <cstdio

BFS(染色) LA 3977 Summits

题目传送门 题意:题意坑爹.问符合条件的的山顶个数 分析:降序排序后从每个点出发,假设为山顶,如果四周的点的高度>h - d那么可以走,如果走到已经走过的点且染色信息(山顶高度)不匹配那么就不是山顶.重点在于就算知道不是山顶也要染色完. #include <bits/stdc++.h> using namespace std; const int N = 5e2 + 5; const int INF = 0x3f3f3f3f; int h, w, d; struct Point { in

Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)

题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比二班的人数多,每个班的人数都大于零. 解题思路: hdu给出的题解是二分图匹配加上贪心,就不多说了. 还可以用bfs对节点染色,建好图后,对节点进行bfs分成,偶数成与奇数成染成不同的颜色,颜色相同的节点都可以分到同一个集合里面,但是要判断一下奇环,如果出现奇环的话,是无法进行分组的.在每次bfs的

UVALive - 3977 Summits (BFS染色)

题目大意:坑爹的题目,题意那么难理解. 讲的就是,如果该点是山顶的话(高度为h),那么以该点为中心,往外辐射,走高度大于h-d的点,到达不了另一个比它高的点 这就提示了,高度要从大到小排序,依次以高的点(假设高度为h)为核心辐射,如果碰上高度小于等于h-d的,表示此路不通了,就在该处停止 反之,如果碰上高度大于h-d的,且没有被染色过的,那么就将其染色 如果碰上高度大于h-d的,且被染色的话,就表明可以走到另一个更高点了,那么此点就不是山顶了 如果中途碰到了和该点一样高的,那么山顶的数量就加1

LightOJ1009---Back to Underworld (bfs染色)

The Vampires and Lykans are fighting each other to death. The war has become so fierce that, none knows who will win. The humans want to know who will survive finally. But humans are afraid of going to the battlefield. So, they made a plan. They coll

hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)

1 /************************************************************************* 2 > File Name: j.cpp 3 > Author: HJZ 4 > Mail: [email protected] 5 > Created Time: 2014年08月28日 星期四 12时26分13秒 6 *******************************************************