对有向图来说,有向图G具有一条单向欧拉回路,当且仅当是连通的,且每个结点入度等于出度。对无向图来说,无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度数均为偶数。
我还是不明白这个题为什么要逆序输出。。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX_N = 50 + 10;
int G[MAX_N][MAX_N], p[MAX_N], degree[MAX_N];
int _find(int x)
{
return p[x] == x ? x : (p[x] = _find(p[x]));
}
void dfs(int u)
{
for(int v = 0; v < MAX_N; v++)
{
if(G[u][v])
{
G[u][v]--, G[v][u]--;
//printf("%d %d\n", u, v);
dfs(v);
printf("%d %d\n", v, u);
}
}
}
int n;
int main()
{
int T, _case = 0;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int u, v, x, y, _beg, _par;
bool flag = true;
memset(G, 0, sizeof(G));
memset(degree, 0, sizeof(degree));
for(int i = 0; i < MAX_N; i++)
p[i] = i;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &u, &v);
G[u][v]++, G[v][u]++;
degree[u]++, degree[v]++;
x = _find(u);
y = _find(v);
if(x != y)
p[x] = y;
}
for(int i = 0; i < MAX_N; i++)
{
if(degree[i])
{
_par = _find(i), _beg = i;
break;
}
}
for(int i = 0; i < MAX_N; i++)
{
if(degree[i])
{
if(_par != _find(i))
{
flag = false;
break;
}
}
}
if(flag)
{
for(int i = 0; i < MAX_N; i++)
{
if(degree[i] % 2 != 0)
{
flag = false;
break;
}
}
}
if(_case != 0)
printf("\n");
printf("Case #%d\n", ++_case);
if(!flag)
printf("some beads may be lost\n");
else
dfs(_beg);
}
return 0;
}