CodeForces 1141G Privatization of Roads in Treeland (贪心+DFS染色)

<题目链接>

题目大意:

给定一棵树,给每条边染色,如果一个结点的两条边是相同颜色的,那么这个结点就是不满意的。
现在要求颜色最少的染色数,使得不满意结点数量<=k。

解题分析:

首先,贪心地想,因为题目允许有最多k个不满意的点,所以我们将所有点的度数从大到小排个序,度数第k+1大的点的度数就是最少的染色数。然后,主要就是给出染色的方案了,我们可以用DFS对整棵树的所有边进行染色,同时,染色的过程中,还要尽可能地保证所有节点周围的边所染的颜色都不重复。所以我让每个节点都维护了一个mark值,然后在染色过程中,贪心地将当前到达的边染成mark++的颜色,如果mark值大于染色数,说明这个节点只能是不满意的,这个时候就将mark置0,继续进行染色。

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5+5;
#define pb push_back
int n,k;
struct Edge{int s,e;}e[N];
struct Edg {int to,loc;};
int deg[N],col[N],mark[N];
int colnum;
vector<Edg>G[N];

bool mycmp(int a,int b){ return a>b; }

void dfs(int u){     //在DFS过程中,贪心地对所有节点周围的边染色
    for(int i=0;i<G[u].size();i++){
        int v=G[u][i].to;
        int id=G[u][i].loc;
        if(col[id])continue;
        col[id]=mark[u]+1;mark[u]++;     //贪心地将u节点连向子节点的边全部优先染成不同颜色
        if(mark[u]>=colnum)mark[u]=0;     //如果出现冲突的话,就将这个点的其它连接子节点的边随便染成一种颜色
        mark[v]=col[id];if(mark[v]>=colnum)mark[v]=0;      //注意将下一个点也要做标记,这样做标记的目地就是尽可能的让一个节点周围的所有边不重复染色
        dfs(v);
    }
}

int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;i++){
        int u,v;scanf("%d %d",&u,&v);
        deg[u]++,deg[v]++;
        e[i]=Edge{u,v};
        G[u].pb(Edg{v,i});
        G[v].pb(Edg{u,i});
    }
    sort(deg+1,deg+1+n,mycmp);
    colnum=deg[k+1];        //得到第k+1个节点的度
    printf("%d\n",colnum);
    dfs(1);
    for(int i=1;i<n;i++)printf("%d ",col[i]);
}

原文地址:https://www.cnblogs.com/00isok/p/10568988.html

时间: 2024-10-16 01:13:30

CodeForces 1141G Privatization of Roads in Treeland (贪心+DFS染色)的相关文章

Codeforces Round #360 (Div. 1)A (二分图&dfs染色)

题目链接:http://codeforces.com/problemset/problem/687/A 题意:给出一个n个点m条边的图,分别将每条边连接的两个点放到两个集合中,输出两个集合中的点,若不可能则输出-1: 思路:通过画图我们不难发现,图中没有出现长度为奇数的环则是可行的,反之则是不行的.那么现在我们只需判断有木有长度为偶数的环即可. 对于这点我们可以直接用dfs搜索+染色,对于当前标记为1的点,我们将其所有儿子标记为2, 对于当前标记为2的点,将其所有儿子标记为1,若出现某个节点的标

Codeforces 191C Fools and Roads(树链剖分)

题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数,然后有M次操作,每次从u移动到v,问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数组标记即可,不需要用线段树. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N, Q, ne, fir

CodeForces 567E President and Roads(最短路 + tarjan)

CodeForces 567E President and Roads Description Berland has n cities, the capital is located in city s, and the historic home town of the President is in city t (s?≠?t). The cities are connected by one-way roads, the travel time for each of the road

UVA 10317 - Equating Equations 贪心 dfs

UVA 10317 - Equating Equations 贪心 dfs ACM 题目地址:UVA 10317 - Equating Equations 题意: 给一个等式,但是这个等式不一定是正确的,要你对等式中的数字重新排序,使得等式成立.等式只有+和-,数字个数小于16. 分析: 以a + b - c = d - e为例子. 1. 我们把等式右边的各项都换到左边,a + b - c - d + e = 0 2. 把+项和-项放一起,就变成(a + b + e) - (c + d) = 0

Codeforces 453C Little Pony and Summer Sun Celebration dfs树上构造

题目链接:点击打开链接 题意: 给定一个无向图 任选一个起点,使得访问每个点的次数奇偶与最后一行的输入一致 思路: 选一个奇数点作为起点 dfs树一下,若子节点不满足则先走到子节点再回来 如此就能保证所有子节点合法 这样dfs结束后最多只有根节点不满足,随便找一个与根相连的点调整一下. #include <stdio.h> #include <string.h> #include <iostream> #include <math.h> #include &

小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)

题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思--在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的一模一样,TLE了. 赛后我在宿舍里修改了好几次--均无果.后来,我大胆地假设,估计是最后两组出问题TLE的..于是我就在程序里,指定在最后两组输出yes或者no,就这样奇葩地AC了-- 我实验了三次,总共有2*2种可能--(差点就觉得人品差到不行了) 终于AC了.当然,平时练习真心不要这样子,但是

codeforces Gym 100187F F - Doomsday 区间覆盖贪心

F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F Description Doomsday comes in t units of time. In anticipation of such a significant event n people prepared m vaults in which, as they think, it will

Codeforces Round #279 (Div. 2) F. Treeland Tour(lis+dfs)

题目链接: huangjing 题意:告诉一个无向无环图,然后求在联通的路上的lis. 思路:枚举起点求lis 复杂度是n^2logn,貌似这复杂度对时间有点玄,估计是数据有点弱... 首先枚举起点,然后求lis,主要是用dfs求的,要用到回溯的思想,我觉得是只要更新了,就要保存那个操作,然后一旦这一次的搜索完成,那么就要立即回复g数组的值,因为有很多不同的路线,所以一条路走完后,就要回复以前的状态哦,免得影响另外一条路..我觉得尽管他们都说是暴力,但是我觉得这个题还是蛮好的... 题目: F.

CodeForces 462B Appleman and Card Game(贪心)

题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase letter written on it. Toastman must choose k cards from Appleman's cards. Then Appleman should give Toastman some coins depending on the chosen cards