-
欧拉回路
- 通过图中每条边且只通过一次,并且经过每一顶点的回路。 无向图欧拉回路判定
- 图连通;图中所有节点度均为偶数
思路:利用并查集先判断图连通性,同时记录每个点的度数
判断条件
1. 当一个点的根节点与其他点的根节点不等,则不连通
2. 当该点的度数是奇数时,则非欧拉图
#include <cstring>
#include <iostream>
using namespace std;
const int N = 100000;
int degree[ N ];
int Father[ N ];
int Find ( int x ) { return ( Father[ x ] == x ) ? x : Father[ x ] = Find ( Father[ x ] ); }
void Union ( int u, int v ) {
int f1 = Find ( u );
int f2 = Find ( v );
if ( f1 != f2 )
Father[ f1 ] = f2;
}
int main () {
int n, m;
while ( scanf ( "%d", &n ) && n ) {
scanf ( "%d", &m );
memset ( degree, 0, sizeof ( degree ) );
for ( int i = 1; i <= n; ++i )
Father[ i ] = i;
int u, v;
for ( int i = 1; i <= m; ++i ) {
scanf ( "%d%d", &u, &v );
Union ( u, v );
++degree[ u ];
++degree[ v ]; // 记录每个点的度数
}
int flag = 1;
int tmp = Find ( 1 );
for ( int i = 1; i <= n; ++i ) {
if ( Find ( i ) != tmp ) { //不存在回路
flag = 0;
break;
}
if ( degree[ i ] & 1 ) { //有奇度顶点
flag = 0;
break;
}
}
printf ( "%d\n", flag );
}
return 0;
}