題目:
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=90847#problem/A
題意:
求無向圖的歐拉回路是否存在,若存在則輸出字典序最小的路徑。
思路:
先判斷是否存在歐拉回路。
對於無向圖,所有的數的度都爲偶數則存在。
dfs 枚舉邊,得到答案。
AC.
#include <iostream>
#include <cstdio>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 50;
const int maxm = 2000;
int n, m;
int du[maxn];
struct Edge{
int u, v;
}edge[maxm];
void addedge(int u, int v, int id)
{
edge[id].u = u;
edge[id].v = v;
}
int vis[maxm];
int path[maxm], tol;
void dfs(int u)
{
int v;
for(int i = 1; i <= m; ++i) {
if(vis[i]) continue;
if(edge[i].u == u) {
v = edge[i].v;
vis[i] = 1;
dfs(v);
path[tol++] = i;
}
else if(edge[i].v == u) {
v = edge[i].u;
vis[i] = 1;
dfs(v);
path[tol++] = i;
}
}
}
void init()
{
tol = 0;
memset(du, 0, sizeof(du));
memset(vis, 0, sizeof(vis));
}
int main()
{
//freopen("in", "r", stdin);
int u, v, id;
while(~scanf("%d%d", &u, &v)) {
if(u == 0 && v == 0) break;
init();
n = 0; m = 0;
int s;
scanf("%d", &id);
addedge(u, v, id);
n = max(n, max(u, v));
m = max(m, id);
if(id == 1) {
s = min(u, v);
}
du[u]++; du[v]++;
while(1) {
scanf("%d%d", &u, &v);
if(u+v == 0) break;
scanf("%d", &id);
n = max(n, max(u, v));
m = max(m, id);
if(id == 1) {
s = min(u, v);
}
addedge(u, v, id);
du[u]++; du[v]++;
}
bool flag = 1;
for(int i = 1; i <= n; ++i) {
if(du[i]%2) {
flag = 0;
break;
}
}
if(!flag) printf("Round trip does not exist.\n");
else {
dfs(s);
for(int i = tol-1; i >= 0; --i) {
printf("%d", path[i]);
if(i == 0) printf("\n");
else printf(" ");
}
}
}
return 0;
}