http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1184
优先小节点搜欧拉道路,如果有奇数入度节点要从这个节点出发。
注意从小到大在算法遍历里是1->n!!!!
path输出来时是n->0!!!!
要是以为算法遍历里是n->1,path输出来时是0->n那就错了
数据
4
2 3
1 2
3 1
1 2
会输出:2 1 2 3 1 错!!!!
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int map1[599][599];
int path[599];
int du[1099];
void find_path_u(int n,int mat[][599],int now,int &step,int *path)
{
int i;
for(i=1;i<=n;i++)//从小到大
{
while(mat[now][i])
{
mat[now][i]--,mat[i][now]--;
find_path_u(n,mat,i,step,path);
}
}
path[step++]=now;
}
int olpath(int n,int mat[][599],int start,int *path)
{
int ret=0;
find_path_u(n,mat,start,ret,path);
return ret;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(map1,0,sizeof(map1));//map注意初始化!!
memset(du,0,sizeof(du));
int i;
int x,y;
int max=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
du[x]++;
du[y]++;
if(max<x)max=x;
if(max<y)max=y;
map1[x][y]++;
map1[y][x]++;
}
int min=0;
for(i=1;i<=max;i++)
{
if(du[i]%2==1)
{
min=i;
break;
}
}
if(min==0)
for(i=1;i<=max;i++)
{
if(du[i]>0)
{
min=i;
break;
}
}
olpath(max,map1,min,path);
for(i=n;i>=0;i--)
{
printf("%d\n",path[i]);
}
}
return 0;
}