您的位置:首页 > 其它

poj 1041 John's trip 欧拉回路

2015-12-26 11:59 330 查看
题目链接

求给出的图是否存在欧拉回路并输出路径, 从1这个点开始, 输出时按边的升序输出。

将每个点的边排序一下就可以。

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9+7;
const int inf = 1061109567;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
vector <pll> v[2000];
int de[2000], cnt, ans[2000], vis[2000];
void add(int a, int b, int c) {
v[a].pb(mk(c, b));
de[a]++;
}
void dfs(int u) {
int len = v[u].size();
for(int i = 0; i<len; i++) {
int to = v[u][i].second;
int e = v[u][i].fi;
if(vis[e])
continue;
vis[e] = 1;
dfs(to);
ans[cnt++] = e;
}
}
int main()
{
int a, b, c;
while(1) {
scanf("%d%d", &a, &b);
if(a+b==0)
break;
scanf("%d", &c);
for(int i = 1; i<1996; i++)
v[i].clear();
mem(de);
mem(vis);
cnt = 0;
add(a, b, c);
add(b, a, c);
while(1) {
scanf("%d%d", &a, &b);
if(a+b==0)
break;
scanf("%d", &c);
add(a, b, c);
add(b, a, c);
}
int flag = 0;
for(int i = 1; i<=1995; i++) {
if(de[i]%2==1) {
flag = 1;
break;
}
sort(v[i].begin(), v[i].end());
}
if(flag) {
puts("Round trip does not exist.");
continue;
}
dfs(1);
for(int i = cnt-1; i>0; i--)
cout<<ans[i]<<" ";
cout<<ans[0]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: