欧拉回路:
如果连通图中顶点的入度全部为偶数则欧拉回路存在
参考:http://blog.sina.com.cn/s/blog_6f846a6e0100vzdo.html
注意欧拉回路的打印技巧
下面这个代码虽然AC,但是由于UVA测试数据图全部连通的缘故,应当判断图是否连通
#include<stdio.h>
#include<string.h>
int g[60][60];
int num[60];
void dfs(int x)
{
int i;
for(i = 1; i <= 50; i ++)
if(g[x][i])
{
g[x][i] --;
g[i][x] --;
dfs(i);
printf("%d %d\n", i, x);
}
}
int main()
{
freopen("F:\\input.txt","r",stdin );
int t;
int a, b;
int n, max, sum, count;
int i, start, temp, x;
int cas = 0;
while(scanf("%d", &t)!= EOF)
{
for(x = 0; x < t; x ++)
{
scanf("%d", &n);
max = 0;
sum = 0;
memset(g, 0, sizeof(g));
memset(num, 0, sizeof(num));
while(n --)
{
scanf("%d%d", &a, &b);
{
g[a][b] ++;
g[b][a] ++;
num[a] ++;
num[b] ++;
sum += 2;
}
}
int flag = 1;
for(i = 1; i <= 50; i ++)
if(num[i] % 2 == 1)
{
flag = 0;
break;
}
else if(num[i] > max)
{
max = num[i];
start = i;
}
if(x)printf("\n");
printf("Case #%d\n", ++cas);
if(flag)
dfs(start);
else
printf("some beads may be lost \n");
}
return 0;
}
}
弄复杂的错误的WA
//state:Wrong Answer
#include<iostream>
#include<cstdio>
#include<cstring>
#include<memory>
#include<queue>
#include<algorithm>
#include<string>
#include<cmath>
#include<stack>
using namespace std;
///
#define Maxn 1010
bool maze[Maxn][Maxn];
bool vis[Maxn][Maxn];
bool used[Maxn];
int inEdges[Maxn];
int outEdges[Maxn];
int degrees[Maxn];
int N;
int nNodes;
struct beads{
int color1;
int color2;
};
stack<beads> stk;
bool dfs(int start, int total)
{
if (total == nNodes)
return true;
int i;
used[start] = true;
for (i = 0; i < Maxn; i++)
{
if ( (maze[start][i]) && (!used[i]) )
{
if (dfs(i, total + 1))
return true;
}
}
return false;
}
void euler(int u)
{
int i;
for (i = 0; i < Maxn; i++)
{
if (maze[u][i] && !vis[u][i])
{
vis[u][i] = vis[i][u] = true;
euler(i);
// cout << u <<" "<< i << endl;
beads temp;
temp.color1 = u;
temp.color2 = i;
stk.push(temp);
}
}
}
int main()
{
freopen("F:\\input.txt","r",stdin );
///
int i, j;
int nCases;
int testnum = 0;
cin >> nCases;
while (nCases--)
{
testnum++;
memset(maze, 0, sizeof(maze));
memset(vis, 0, sizeof(vis));
memset(used, 0, sizeof(used));
memset(inEdges, 0, sizeof(inEdges));
memset(outEdges, 0, sizeof(outEdges));
memset(degrees, 0, sizeof(degrees));
nNodes = 0;
while (!stk.empty())
stk.pop();
if (testnum != 1)
cout << endl;
cout << "Case #" << testnum << endl;
cin >> N;
for (i = 0; i < N; i++)
{
int from, to;
cin >> from >> to;
maze[from][to] = maze[to][from] = true;
inEdges[to]++;
outEdges[from]++;
degrees[from]++;
degrees[to]++;
if (!used[from])
{
nNodes++;
used[from] = true;
}
if (!used[to])
{
nNodes++;
used[to] = true;
}
}
memset(used, 0, sizeof(used));
int pos;
for (pos = 0; pos < Maxn; pos++)
{
if (outEdges[pos] != 0) //第一个输出的
break;
}
if (!dfs(pos, 1))
{
cout << "some beads may be lost" << endl;
continue;
}
int special = 0;
for (i = 0; i < Maxn; i++)
{
if (degrees[i] % 2 != 0)
{
special = -1;
break;
}
}
if (special == 0)
{
euler(pos);
while (!stk.empty())
{
beads temp;
temp = stk.top();
stk.pop();
cout << temp.color1 << " " << temp.color2 << endl;
}
}
else
cout << "some beads may be lost" << endl;
}
///
return 0;
}