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;
}
posted @ 2021-12-06 20:19  lahlah  阅读(42)  评论(0编辑  收藏  举报