将这张图化简,不断删掉度为1的点(类似于拓扑排序),构成了一张由环组成的图
考虑一个连通块中,设点数为n,边数为m(已经删掉了度为1的点),那么一共只有三种情况:
1.一个环($n=m$),一定为YES
2.多个环嵌套($n+1<m$),一定为NO
3.两个环($n+1=m$),其实可以看成有两个点(可以重合),然后这两个点中间有三条路径,记长度分别为l1,l2,l3,那么有结论:当且仅当三条边依次为2,2和偶数时成立
证明:
首先三条边必然要同奇偶,否则存在奇环,对于奇环上的点都选择集合${AB}$即可卡掉
然后如果三条边都是奇数,由于原图不存在重边,因此最多只有一条路径上没有点,不妨设$l1,l2>1$,可以用l3来构造两点不同,l1来构造不能选AB,l2来构造不能选BA
那么三条边都是偶数,如果其中只有1条边小于等于2,那么$l1,l2\ge 4$,同理可以用l3来构造两点相同,l1来卡掉都选A,l2来卡掉都选B
当有两条路径长度小于等于2(由于没有重边,所以一定都恰好为2),很容易发现无法卡掉

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 10005
4 queue<int>q;
5 vector<int>v[N];
6 int t,n,m,x,y,a[N],r[N],vis[N];
7 void dfs(int k,int fa){
8 if (vis[k])return;
9 vis[k]=1;
10 if (r[k]>2)a[++a[0]]=k;
11 x++;
12 for(int i=0;i<v[k].size();i++)
13 if ((r[v[k][i]]>1)&&(v[k][i]!=fa)){
14 if ((fa)||(!vis[v[k][i]]))y++;
15 dfs(v[k][i],k);
16 }
17 }
18 void calc(int k,int fa,int x,int s){
19 if (k==x){
20 a[++a[0]]=s;
21 return;
22 }
23 for(int i=0;i<v[k].size();i++)
24 if ((r[v[k][i]]>1)&&(v[k][i]!=fa))calc(v[k][i],k,x,s+1);
25 }
26 int main(){
27 scanf("%d",&t);
28 while (t--){
29 scanf("%d%d",&n,&m);
30 memset(r,0,sizeof(r));
31 memset(vis,0,sizeof(vis));
32 for(int i=1;i<=n;i++)v[i].clear();
33 for(int i=1;i<=m;i++){
34 scanf("%d%d",&x,&y);
35 r[x]++;
36 r[y]++;
37 v[x].push_back(y);
38 v[y].push_back(x);
39 }
40 for(int i=1;i<=n;i++){
41 if (!r[i])vis[i]=1;
42 if (r[i]==1)q.push(i);
43 }
44 while (!q.empty()){
45 int k=q.front();
46 q.pop();
47 vis[k]=1;
48 for(int i=0;i<v[k].size();i++)
49 if (--r[v[k][i]]==1)q.push(v[k][i]);
50 }
51 bool flag=0;
52 for(int i=1;i<=n;i++){
53 x=y=a[0]=0;
54 dfs(i,0);
55 if ((x==y)&&(x%2==0))continue;
56 if ((a[0]<2)||(x+1<y)||(x==y)&&(x&1)){
57 flag=1;
58 break;
59 }
60 x=a[1];
61 y=a[2];
62 a[0]=0;
63 calc(x,0,y,0);
64 sort(a+1,a+a[0]+1);
65 if ((a[1]&1)||(a[2]&1)||(a[3]&1)||(a[2]>2)){
66 flag=1;
67 break;
68 }
69 }
70 if (flag)printf("NO\n");
71 else printf("YES\n");
72 }
73 }

[bzoj5295]染色的更多相关文章

  1. bzoj2243树链剖分+染色段数

    终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...

  2. 51nod 算法马拉松18 A 染色问题

    染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...

  3. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  4. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  5. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  6. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  7. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  8. POJ1112 Team Them Up![二分图染色 补图 01背包]

    Team Them Up! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7608   Accepted: 2041   S ...

  9. UVALive 4849 String Phone(2-sat、01染色)

    题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...

随机推荐

  1. nvidia jetson xavier 风扇开机自启动

    作者声明 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 原文链接:https://www.cnblogs.com/phoenixash/p/15 ...

  2. 寻找最佳路径(ArcPy实现)

    一.背景 随着社会经济发展需求,公路的重要性日益提高.在一些交通欠发达的地区,公路建设迫在眉睫.如何根据实际地形情况设计出比较合理的公路规划,是一个值得研究的问题. 二.实验目的: (1)通过练习,熟 ...

  3. 实现前后端分离,最好的方案就是SPA(Single Page Application)

    从通常意义来讲,说到必须,就是指最佳实践上,实现前后端分离,最好的方案就是SPA.所以才会有 前后端分离=SPA 的近似,忽视了其中的差别.但是,既然有疑问了,我们就来看一下,为什么SPA是实现前后端 ...

  4. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

  5. MySQL:基础语法-1

    MySQL:基础语法-1 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 关于数据库的安装操 ...

  6. RocketMQ源码详解 | Producer篇 · 其一:Start,然后 Send 一条消息

    概述 DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); ...

  7. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  8. 21.8.7 test

    \(NOIP\) 测试 考的一般般. \(T1\) WOJ4656 签到题,其实就是算 \(\sum\limits_{i=1}^n i^2\) #include<bits/stdc++.h> ...

  9. 查找最小生成树:克鲁斯克尔算法(Kruskal)算法

    一.算法介绍 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应用.和 ...

  10. 第01课 OpenGL窗口(3)

    接下来的代码段创建我们的OpenGL窗口.我花了很多时间来做决定是否创建固定的全屏模式这样不需要许多额外的代码,还是创建一个容易定制的友好的窗口但需要更多的代码.当然最后我选择了后者.我经常在EMai ...