题面

题解

推结论大题……然而我推不出什么结论

奇环显然是NO

如果一个联通块里有两个分离的环,也是NO

如果一个联通块里,点数为n,边数为m

m <= n的时候,是YES

m >= n + 2的时候,肯定是NO

m = n + 1的时候

如果只存在一个双联通分量的话,取出这个双联通分量,存在两个点点度为3

他们之间有3条路径,如果其中两条为2的话答案是YES,否则是NO

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 20005
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next;
}E[MAXN * 2];
int N,M,head[MAXN],sumE,col[MAXN];
int dfn[MAXN],low[MAXN],idx,sta[MAXN],top,cnt,Ecnt,Ncnt,tot;
int vis[MAXN],tims,deg[MAXN],path[5],pc;
vector<int> ver[MAXN];
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
void Init() {
read(N);read(M);
sumE = 0;memset(head,0,sizeof(head));
memset(col,0,sizeof(col));memset(vis,0,sizeof(vis));tims = 0;
memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));idx = 0;
int u,v;
for(int i = 1 ; i <= M ; ++i) {
read(u);read(v);
add(u,v);add(v,u);
}
}
bool color(int u) {
if(!col[u]) col[u] = 2;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(!col[v]) {
col[v] = col[u] ^ 1;
if(!color(v)) return false;
}
else if(col[v] == col[u]) return false;
}
return true;
}
void Tarjan(int u) {
dfn[u] = low[u] = ++idx;
sta[++top] = u;
++Ncnt;
for(int i = head[u] ; i ; i = E[i].next) {
++Ecnt;
int v = E[i].to;
if(dfn[v]) {low[u] = min(low[u],dfn[v]);}
else {
Tarjan(v);
if(low[v] >= dfn[u]) {
int t = 1;
++tot;ver[tot].clear();ver[tot].pb(u);
while(1) {
int x = sta[top--];
++t;
ver[tot].pb(x);
if(x == v) break;
}
if(t >= 4) ++cnt;
}
low[u] = min(low[u],low[v]);
}
}
}
void dfs_path(int u,int fa,int ed,int dep) {
if(u == ed) {path[++pc] = dep;return;}
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(vis[v] == tims && v != fa) {
dfs_path(v,u,ed,dep + 1);
}
}
}
void Solve() {
for(int i = 1 ; i <= N ; ++i) {
if(!col[i]) {
if(!color(i)) {puts("NO");return;}
}
} for(int i = 1 ; i <= N ; ++i) {
if(!dfn[i]) {
top = 0;cnt = 0;Ecnt = 0;Ncnt = 0;tot = 0;
Tarjan(i);
Ecnt /= 2;
if(Ecnt <= Ncnt) continue;
if(Ecnt >= Ncnt + 2) {puts("NO");return;}
if(cnt >= 2) {puts("NO");return;}
++tims;
int st,ed;
for(int j = 1 ; j <= tot; ++j) {
if(ver[j].size() >= 4) {
for(int k = 0 ; k < ver[j].size() ; ++k) {
vis[ver[j][k]] = tims;
deg[ver[j][k]] = 0;
}
for(int k = 0 ; k < ver[j].size() ; ++k) {
int u = ver[j][k];
for(int h = head[u] ; h ; h = E[h].next) {
int v = E[h].to;
if(vis[v] == tims) {
++deg[u];
}
}
}
st = 0;ed = 0;
for(int k = 0 ; k < ver[j].size() ; ++k) {
int u = ver[j][k];
if(deg[u] == 3) {
if(!st) st = u;
else if(!ed) ed = u;
}
}
break;
}
}
pc = 0;
dfs_path(st,0,ed,0);
sort(path + 1,path + pc + 1);
if(path[1] == 2 && path[2] == 2) continue;
else {puts("NO");return;}
}
}
puts("YES");
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
int T;
read(T);
while(T--) {
Init();
Solve();
}
return 0;
}

【LOJ】#2493. 「BJOI2018」染色的更多相关文章

  1. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  2. 「BJOI2018」链上二次求和

    「BJOI2018」链上二次求和 https://loj.ac/problem/2512 我说今天上午写博客吧.怕自己写一上午,就决定先写道题. 然后我就调了一上午线段树. 花了2h找到lazy标记没 ...

  3. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  4. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  5. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  6. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  7. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  8. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  9. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

随机推荐

  1. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  2. 【刷题】LOJ 6003 「网络流 24 题」魔术球

    题目描述 假设有 \(n\) 根柱子,现要按下述规则在这 \(n\) 根柱子中依次放入编号为 \(1, 2, 3, 4, \cdots\) 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任 ...

  3. System.gc()与Runtime.gc()的区别

    (1) GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象 ...

  4. Path Sum II - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Path Sum II - LeetCode 注意点 不要访问空结点 解法 解法一:递归,DFS.每当DFS搜索到新节点时,都要保存该节点.而且每当找出一 ...

  5. linux命令总结之echo命令

    echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串. echo命令的语法是: echo [选 ...

  6. android编译时出现org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugJavaWithJavac'.错误

    android studio中使用terminal工具.在android studio最下面的底部菜单栏中有(如果没有那cmd中进入项目根目录后): 使用命令  gradlew compileDebu ...

  7. python教程2:list和tuple

    list和tuple都是数组,区别在于list可以随意增删改查,而tuple在赋值了之后只能查看了,所以tuple是比较安全的相对于list来说 list 定义一个list数组,名字就叫list,可以 ...

  8. JeeSite 4.x 树形结构的表设计和用法

    有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章. 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理 ...

  9. Java面试题系列(一)描述一下JVM加载class文件的原理机制

    JVM系列第4讲:从源代码到机器码,发生了什么? https://www.cnblogs.com/chanshuyi/p/jvm_serial_04_from_source_code_to_machi ...

  10. ASP.NET MVC学习(三)之过滤器Filter

    http://www.cnblogs.com/yaopengfei/p/7910763.html