[bzoj5295]染色
考虑一个连通块中,设点数为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]染色的更多相关文章
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- 51nod 算法马拉松18 A 染色问题
染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- POJ1112 Team Them Up![二分图染色 补图 01背包]
Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ...
- UVALive 4849 String Phone(2-sat、01染色)
题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...
随机推荐
- 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)
补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...
- js--typeof 和 instanceof 判断数据类型的区别及开发中的使用
前言 日常的开发中,我们经常会遇到判断一个变量的数据类型或者该变量是否为空值的情况,你是如何去选择判断类型的操作符的?本文来总结记录一下我们开发人员必须掌握的关于 typeof 和 instanceo ...
- PTA实验11-1-7 藏头诗 (15分)
实验11-1-7 藏头诗 (15分) 本题要求编写一个解密藏头诗的程序. 输入格式: 输入为一首中文藏头诗,一共四句,每句一行.注意:一个汉字占两个字节. 输出格式: 取出每句的第一个汉字并连接在一起 ...
- PTA数据结构 习题2.8 输出全排列 (20分)
习题2.8 输出全排列 (20分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出正整数n(<10 ...
- Coursera Deep Learning笔记 逻辑回归典型的训练过程
Deep Learning 用逻辑回归训练图片的典型步骤. 笔记摘自:https://xienaoban.github.io/posts/59595.html 1. 处理数据 1.1 向量化(Vect ...
- OO第四次博客作业--第四单元总结及课程总结
一.总结第四单元两次作业的架构设计 1.1 第一次作业 类图如下: 为了突出类.接口.方法.属性.和参数之间的层次结构关系,我为 Class 和 Interface 和 Operation 分别建立了 ...
- 基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中
基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中 一.背景 二.实现方案 1.基于@ComponentScan注解实现 2.基 ...
- C++ Boost signal2信号/插槽
#include "stdafx.h" #include "boost/signals2.hpp" #include "boost/bind.hpp& ...
- STM32串口通信配置(USART1+USART2+USART3+UART4) (转)
一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...
- 笔记本加装SSD并装系统
1,首先了解笔记本配置信息 一般加装SSD都是120~256左右,并使用原有的机械硬盘:首先确定加装位置:1,是否支持M.2接口:假如支持,可以直接购买,拆机装上:我的笔记本不支持:所以考虑2,光驱的 ...