这道题一开始我没想什么直接开始染, 但是是for循环一个节点一个节点染, 然后就WA

后了看了https://www.cnblogs.com/jerryRey/p/4702323.html

发现原来还需要证明一下染色一定可以, 同时染色的方式是dfs

(1)证明

首先, 如果最大度数sum是偶数, 那么按照题目意思, k就为sum+1.

这个时候最坏情况下最大度数点与周围点的颜色都不一样, 需要sum+1种颜色, 也就是刚好是

k, 所以这种情况一定可以用k种颜色染完

其次, 如果最大度数sum是奇数的话, 此时k=sum, 最坏情况也是最大度数点与周围点的颜色都不一样。

但是这种情况可以证明是不存在的, 因为n为奇数

假设这种情况存在, 那么最大度数点u的一个相邻点v, 那么v一定有degree[u](u的度数)

个颜色不相同的点在v周围。为什么呢, 如果不是的话, 那么v的颜色就有多种可能

(没有被周围点限制), 那么就不满足前面所讲的最大度数点与周围点颜色不一样,

因为v可以为其他颜色。所以v一定有degree[u](u的度数)个颜色不相同的点在v周围。

那么可以推出u周围所有点都是这样, 同理u周围的点的周围点也是这样。

所以这个图是个完全图, 也就是说一个点和其他所有节点都可以直接连接。

那么, 前面说最大度数sum是奇数, 那么图中点的个数为sum+1(本身),

也就是点数为偶数。与题目给的n为奇数是矛盾的。

所以在最大度数sum是奇数这种情况下, 一定不存在最大度数点与周围点的颜色都不一样这

中情况(此时需要颜色数为sum+1), 也就是说需要颜色一定小于这种情况需要的颜色(需要颜色 < sum + 1) 

也就是 需要颜色<= sum = k, 所以k种颜色一定可以染完。

(2)染色方式

貌似dfs这样染周围的点的方式比较优。我之前用for循环遍历点来染色的方法会把后面的点“堵死”。

(3)另外, 学到了 a | 1是奇数不变, 偶数加1, 以及max_element的用法, 加上*表示指针的值

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 11234;
vector<int> g[MAXN];
int degree[MAXN], color[MAXN], vis[MAXN], n, m, k; void dfs(int u) //dfs染色
{
REP(i, 0, g[u].size() - 1)
vis[color[g[u][i]]] = u; REP(i, 1, k)
if(vis[i] != u)
{
color[u] = i;
break;
} REP(i, 0, g[u].size() - 1)
if(!color[g[u][i]])
dfs(g[u][i]);
} int main()
{
while(~scanf("%d%d", &n, &m))
{
REP(i, 1, n) g[i].clear();
memset(degree, 0, sizeof(degree));
memset(color, 0, sizeof(color));
memset(vis, 0, sizeof(vis)); while(m--)
{
int x, y;
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
degree[x]++; degree[y]++;
} k = (*max_element(degree+1, degree+n+1)) | 1; //偶+1, 奇不变。
dfs(1); // max_element求最大值, 返回指针 printf("%d\n", k);
REP(i, 1, n) printf("%d\n", color[i]);
puts("");
} return 0;
}

紫书 习题8-9 UVa 1613 (dfs染色+图的性质)的更多相关文章

  1. 【紫书】Oil Deposits UVA - 572 dfs求联通块

    题意:给你一个地图,求联通块的数量. 题解: for(所有还未标记的‘@’点) 边dfs边在vis数组标记id,直到不能继续dfs. 输出id及可: ac代码: #define _CRT_SECURE ...

  2. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  3. 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)

    很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...

  4. 紫书 习题8-12 UVa 1153(贪心)

    本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...

  5. 紫书 习题8-7 UVa 11925(构造法, 不需逆向)

    这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...

  6. UVA 1613 K度图染色

    题目 \(dfs+\)证明. 对于题目描述,可以发现\(K\)其实就是大于等于原图中最大度数的最小奇数,因为如果原图度数最大为奇数,则最多颜色肯定为K,而如果原图最大度数为偶数,则\(K\)又是奇数, ...

  7. 紫书 习题7-13 UVa 817(dfs+栈求表达式的值)

    题目链接  点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说 ...

  8. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  9. 紫书 习题 11-17 UVa 1670 (图论构造)

    一开始要符合题目条件, 那么肯定没有任何一个点是孤立的, 也就是说没有点的度数是1 所以我就想让度数是1的叶子节点相互连起来.然后WA 然后看这哥们的博客 https://blog.csdn.net/ ...

随机推荐

  1. laravel 模板

    1.{!! $data !!}  $data不会被转义

  2. Codeforces 679A Bear and Prime 100

    链接:传送门 题意:给你一个隐藏数,这个隐藏数在[2,100]之间,现在最多可以询问20次,每次询问的是这个数是不是隐藏数的底数,是为yes,不是为no,每次询问后都需要flush一下输出缓冲区,最后 ...

  3. SQL在线学习网站

    1.在线编写网页:http://sqlfiddle.com/ 2.SQL菜鸟教程:http://www.runoob.com/sql/sql-intro.html 3.SQL语句在线练习 http:/ ...

  4. [Angular] Set Metadata in HTTP Headers with Angular HttpHeaders

    Besides sending (or requesting) the actual data to the server API, there’s also often the need to se ...

  5. Crazyflie 2.0 System Architecture

    Crazyflie 2.0架构包含两个微控制器: A NRF51, Cortex-M0, 用于实现无线通信和电源管理: (1)按键开关逻辑(ON/OFF logic) (2)控制给其它系统供电(STM ...

  6. C++链接和执行相关错误

    http://blog.csdn.net/pipisorry/article/details/37610401 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文 ...

  7. 使用ViewPager实现广告滑动效果

    效果图:               watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSk1DNjAx/font/5a6L5L2T/fontsize/400/ ...

  8. leetcode 题解 || Longest Common Prefix 问题

    problem: Write a function to find the longest common prefix string amongst an array of strings. 寻找 0 ...

  9. httpClient模拟登陆校内某系统

    package com.huowolf; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpE ...

  10. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...