这个题我刚开始没有考虑有环的情况,用了个自以为简单的方法,然后一直错了
代码如下。
#include<stdio.h>
#include<stdlib.h>
int total[510][510]={0};
int min=1000,max=0;
int ans[3000]={0},f=0;
int sum=0;
/*=========================
每个结点从小到大dfs当其没有其它结点时
将其放在输出数组里
===========================*/
void dfs(int n,int m)
{
int i ,j;
if(sum==m) return; //访问的边的条数等于m,结束
for(i=min;i<=max;i++)
if(total[n][i])
{
total[n][i]--; //两者边的条数减1
total[i][n]--;
sum++; //边的条数加1
dfs(i,m);
ans[f++]=i;
}
}
/*===============================
主要了解欧拉回路的性质,当结点度数全部
为偶数时可以从任一结点开始,但只有奇数时
只能从奇数开始,奇数结束。
==============================*/
int main()
{
FILE *fin=fopen("fence.in","r");
FILE *fout=fopen("fence.out","w");
int edge[510]={0};
int num;
int i ,j,x,y;
int start;
fscanf(fin,"%d",&num);
for(i=0;i<num;i++)
{
fscanf(fin,"%d %d",&x,&y);
edge[x]++;edge[y]++;
total[x][y]++;
total[y][x]++;
min=min<x?min:x;
min=min<y?min:y;
max=max>x?max:x;
max=max>y?max:y;
}
start=min;
for(i=min;i<=max;i++)
{
if(edge[i]%2)
{
start=i;
break;
}
}
dfs(start,num);
ans[f]=start;
for(i=f;i>=0;i--)
{
fprintf(fout,"%d\n",ans[i]);
}
return 0;
}