这道题一开始我没想什么直接开始染, 但是是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. Vue学习之路第十篇:简单计算器的实现

    前面九篇讲解了vue的一些基础知识,正所谓:学以致用,今天我们将用前九篇的基础知识,来模拟实现计算器的简单功能,项目价值不高,纯粹是为了加深掌握所学知识. 学前准备: 需要掌握JavaScript的e ...

  2. javaScript(其他引用类型对象)

    javascript其他引用类型对象 Global对象(全局)这个对象不存在,无形的对象,无法new一个 其内部定义了一些方法和属性:如下 encodeURI str = www.baidu.com ...

  3. [luogu1772 ZJOI2006] 物流运输 (最短路 线性dp)

    题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...

  4. Python-基础-day6

    1.二进制 前言:计算机一共就能做两件事:计算和通信 2.字符编码 生活中的数字要想让计算机理解就必须转换成二进制.十进制到二进制的转换只能解决计算机理解数字的问题,那么文字要怎么让计算机理解呢? 于 ...

  5. ajax的两种使用方式

    一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...

  6. MRv2 工作机制 、 公平调度器、MR压缩、边数据

    对于节点数超过 4000 的大型集群,前一节描述的 MapReduce 系统开始面临着扩展的瓶颈. 2010 年 Yahoo 的团队开始设计下一代的 MapReduce. (Yet Another R ...

  7. APP热更新方案(转)

    本文转载自[http://creator.cnblogs.com/] 博客地址:Zealot Yin 为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就 ...

  8. poj - 1050 - To the Max(dp)

    题意:一个N * N的矩阵,求子矩阵的最大和(N <= 100, -127 <= 矩阵元素 <= 127). 题目链接:http://poj.org/problem?id=1050 ...

  9. yolo环境配置

    主要配置参考官网https://pjreddie.com/darknet/yolo/ 为了能够可视化,另安装cuda+opencv cuda版本为9.0 opencv版本为3.1.0 先安装cuda再 ...

  10. JAVA设计模式之【职责链模式】

    职责链模式 专门处理请求链式传递的模式 角色 Handler抽象处理者 ConcreteHandler具体处理者 在职责链模式中,很多对象由每一个对象对其下家的引用而连接成一条链,请求在这条链上传递, ...