📜  门| Gate IT 2007 |第39章(1)

📅  最后修改于: 2023-12-03 15:28:40.408000             🧑  作者: Mango

门| Gate IT 2007 |第39章

简介

门| Gate是2007年国际大学生程序设计竞赛(ACM-ICPC)中的一道经典题目,被用作数据结构算法的考察。它要求计算出给定的图是否是欧拉图,即在其中是否存在一条路径经过每个边恰好一次。

题目描述

给定一个无向图,判断是否为欧拉图。

输入格式

输入的第一行包含两个整数n和m,分别表示图中点的数目和边的数目。接下来m行,每行包含两个整数u和v(1≤u,v≤n),表示连接两个点的一条边。

输出格式

如果给定的图为欧拉图,则输出“Yes”,否则输出“No”。

数据范围

1≤n≤1000, 0≤m≤n×(n−1)/2

解题思路

对于无向连通图G=(V,E),如果G中每个顶点的度数都是偶数,则G是欧拉图。如果G中恰有两个顶点的度数是奇数,则G是半欧拉图。否则,G不是欧拉图。

对于无向非连通图,如果它的每个连通分量都是欧拉图,则该无向图是欧拉图。如果有恰好一个连通分量不是欧拉图,则该无向图是半欧拉图。否则,该无向图不是欧拉图。

参考代码
#include<bits/stdc++.h>
using namespace std;
int fa[1010];
int find(int x){ return fa[x] == x ? x : fa[x] = find(fa[x]); }
int n,m,t,k,cnt;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) fa[i] = i;
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        t = find(u) , k = find(v);
        if(t != k) fa[t] = k;
    }
    for(int i=1;i<=n;i++) if(fa[i] == i) cnt++;
    if(cnt > 1) puts("No");
    else{
        int d[1010] = {0},ans = 0;
        for(int i=1;i<=n;i++) if(fa[i] == i) ans++;
        if(ans == 0) puts("No");
        else{
            for(int i=1;i<=n;i++){
                if(d[find(i)] & 1){
                    puts("No");
                    return 0;
                }
                d[find(i)] += (i == find(i));
            }
            puts("Yes");
        }
    }
    return 0;
}