AT4518 [AGC032C] Three Circuits
https://www.luogu.com.cn/problem/AT4518
考虑如果有解,一定存在欧拉回路
那么所有点到度数一定是偶数
否则无解
因为欧拉回路的环是可以拆的,所以如果存在一个度数
>
=
6
>=6
>=6的点那么一定有解
如果存在3个或以上的度数为
4
4
4的点,那么也一定有解
如果存在两个度数为 4 4 4的点,需要分类讨论一下,去掉其中一个后时候还是联通的,如果是就无解
code:
#include<bits/stdc++.h>
#define N 200050
using namespace std;
int n, m, in[N], vis[N];
vector<int> g[N], a;
void dfs(int u) {
if(vis[u]) return ;
vis[u] = 1;
for(int v : g[u]) dfs(v);
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v), g[v].push_back(u);
in[u] ++, in[v] ++;
}
int f = 0;
for(int i = 1; i <= n; i ++) {
if(in[i] & 1) {
printf("No");
return 0;
}
if(in[i] == 4) a.push_back(i);
if(in[i] >= 6) f = 1;
}
if(f || a.size() > 2) {
printf("Yes");
return 0;
}
if(a.size() < 2) {
printf("No");
return 0;
}
vis[a[1]] = 1; dfs(a[0]);
for(int i = 1; i <= n; i ++) {
if(!vis[i]) {
printf("Yes");
return 0;
}
}
printf("No");
return 0;
}