USACO 3.3.1 骑马修栅栏
2017年6月2日
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int F, N;
#define maxx 510
int edges[maxx][maxx];
int num_pts[maxx];
int Recalls[maxx * maxx + 100];
int tails = 0;
void Finds(int s)
{
if(num_pts[s] == 0){
Recalls[++tails] = s;
return;
}
for(int i = 1; i <= N; i++)
if(edges[i][s] > 0){
edges[i][s]--; edges[s][i]--;
num_pts[s]--; num_pts[i]--;
Finds(i);
if(num_pts[s] == 0){
Recalls[++tails] = s;
return;
}
}
if(num_pts[s] == 0)
Recalls[++tails] = s;
}
void Gotos()
{
int Q[3] = {0, 140000, 150000};
int p = 0;
for(int i = 1; i <= N; i++)
if(num_pts[i] % 2 == 1)
Q[++p] = i;
if(p != 0)
Finds(min(Q[1], Q[2]));
else
Finds(1);
}
int main()
{
cin >> F;
int a, b;
memset(edges, 0, sizeof(edges));
memset(num_pts, 0, sizeof(num_pts));
for(int i = 1; i <= F; i++){
cin >> a >> b;
N = max(a, N); N = max(b, N);
edges[a][b]++; edges[b][a]++;
num_pts[a]++; num_pts[b]++;
}
Gotos();
for(int i = tails; i >= 1; i--)
cout << Recalls[i] << endl;
return 0;
}