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
****************************************************/