问题
http://hihocoder.com/problemset/problem/1181?sid=784004
解法
伪代码
DFS(u):
While (u存在未被删除的边e(u,v))
删除边e(u,v)
DFS(v)
End
PathSize ← PathSize + 1
Path[ PathSize ] ← u
#include <bits/stdc++.h>
using namespace std;
enum{maxn = 1000+4, maxm = 5005};
vector<int> G[maxn];
int degree[maxn];
class E{
public:
E(int _a, int _b)
{
a = min(_a, _b);
b = max(_a, _b);
};
int a, b;
bool operator<(const E& e)const
{
return a==e.a? (b<e.b) : (a<e.a);
}
};
map<E, int> edgeCnt;
void dfs(int u)
{
for (int i=0; i< G[u].size(); ++i)
{
int v= G[u][i];
E e(u, v);
if (edgeCnt[e])
{
--edgeCnt[e];
dfs(v);
}
}
printf("%d ", u);
}
int main()
{
//freopen("in.txt", "r", stdin);
int n, m;
scanf("%d %d", &n, &m);
memset(degree, 0, sizeof(degree));
edgeCnt.clear();
for (int i=0; i< m; ++i)
{
int a, b;
scanf("%d %d", &a, &b);
G[a].push_back(b);
G[b].push_back(a);
++degree[a];
++degree[b];
++edgeCnt[E(a, b)];
}
int start = 1;
for (int i=2; i<=n; ++i)
{
if (degree[start]==0 || (degree[start]%2 ==0 && degree[i]%2))
start = i;
if (degree[start]%2)
break;
}
dfs(start);
putchar('\n');
return 0;
}