半年前刚学图论的时候就做过 今天竟然忘了 翻书才想起来欧拉路。。
也就是一笔画问题 深搜就可以了
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
#define in = read();
typedef long long ll;
typedef unsigned int ui;
const ll size = 1500 + 10;
int f , x , y;
int map[size][size];
int start = 1 , minn , maxx , len;
int ans[size] , du[size];
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
void dfs(int i){
for(register int j=minn;j<=maxx;j++)
if(map[i][j]){
map[i][j] --;
map[j][i] --;
dfs(j);
}
ans[++ len] = i;
}
int main(){
f in;
for(register int i=1;i<=f;i++){
x in; y in;
map[x][y] ++; map[y][x] ++;
du[x] ++; du[y] ++;
minn = min(min(x , minn) , y);
maxx = max(max(x , maxx) , y);
}
for(register int i=minn;i<=maxx;i++)
if(du[i]%2 == 1){
start = i;
break;
}
dfs(start);
for(register int i=len;i>=1;i--)
printf("%d\n" , ans[i]);
}
//COYG