Think:
1知识:
1>欧拉回路:从一点出发经过图中每边一次且仅一次又回到出发点
2>无向图存在欧拉回路:无向连通图+所有结点度为偶数
2知识点:并查集
3知识拓展:
1>有向图存在欧拉回路:有向连通图+所有结点入度等于出度
2>混合图存在欧拉回路:
——建议参考博客
以下为Accepted代码
#include <bits/stdc++.h>
using namespace std;
int n, f[1004], deg[1004];
void Init();
int get_f(int v);
void Merge(int u, int v);
bool Ans();
int main(){
int T, m, i, u, v;///n为全局变量注意不要重复定义
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &m);
memset(deg, 0, sizeof(deg));
Init();
for(i = 1; i <= m; i++){
scanf("%d %d", &u, &v);
Merge(u, v);
deg[u]++, deg[v]++;
}
if(Ans())
printf("1\n");
else
printf("0\n");
}
return 0;
}
void Init(){
for(int i = 1; i <= n; i++)
f[i] = i;
}
int get_f(int v){
if(f[v] == v)
return f[v];
else {
f[v] = get_f(f[v]);
return f[v];
}
}
void Merge(int u, int v){
int t1 = get_f(u);
int t2 = get_f(v);
if(t1 != t2)
f[t2] = t1;
}
bool Ans(){
int cnt = 0, flag = 0;
for(int i = 1; i <= n; i++){
if(f[i] == i)
cnt++;
if(deg[i]%2 != 0)
flag = 1;
if(flag || cnt > 1)
break;
}
if(flag || cnt != 1)
return false;
else
return true;
}
/***************************************************
User name:
Result: Accepted
Take time: 0ms
Take Memory: 256KB
Submit time: 2017-07-14 16:24:25
****************************************************/

本文介绍了欧拉回路的基本概念及其在无向图中的应用条件,并通过一道编程题详细展示了如何利用并查集判断一个无向图是否具备欧拉回路。此外,还提供了完整的AC代码作为参考。
525

被折叠的 条评论
为什么被折叠?



