题目连接:http://ace.delos.com/usacoprob2?a=tnR7wG1rE1B&S=fence
题目大意:给定一个无向图,求出此图的欧拉路径(经过的顶点序列),如果存在多组解,把路径看成500进制下的数,从小到大输出。
思路:dfs。从度数为奇数的最小的点开始深搜,如果不存在度数为奇数的点,从最小的点深搜。
代码:
/*
ID: czq1992
LANG: C++
TASK: fence
*/
#include <iostream>
#include <cstdio>
using namespace std;
int map[505][505],Max,Min,path[100000],fence[505],cnt=0;
void dfs(int a)
{
int i;
for(i=Min;i<=Max;i++)
{
if(map[a][i])
{
map[a][i]--;
map[i][a]--;
dfs(i);
}
}
path[cnt++]=a;
}
int main()
{
freopen("fence.in","r",stdin);
freopen("fence.out","w",stdout);
int f,a,b,i,s;
cin>>f;
Max=-1;Min=505;
for(i=0;i<f;i++)
{
cin>>a>>b;
map[a][b]++;
map[b][a]++;
fence[a]++;
fence[b]++;
Max=max(max(b,a),Max);
Min=min(min(b,a),Min);
}
s=0;
for(i=Min;i<=Max;i++)
{
if(fence[i]%2) {s=i;break;}
}
if(!s)
{
for(i=Min;i<=Max;i++) if(fence[i]) {s=i;break;}
}
dfs(s);
//cout<<cnt<<endl;
for(i=cnt-1;i>=0;i--)cout<<path[i]<<endl;
return 0;
}