📅  最后修改于: 2023-12-03 15:28:40.408000             🧑  作者: Mango
门| 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;
}