poj 1041 John's trip 欧拉回路

题目链接

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

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

 1 #include <iostream>
 2 #include <vector>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <map>
 8 #include <set>
 9 #include <string>
10 #include <queue>
11 using namespace std;
12 #define pb(x) push_back(x)
13 #define ll long long
14 #define mk(x, y) make_pair(x, y)
15 #define lson l, m, rt<<1
16 #define mem(a) memset(a, 0, sizeof(a))
17 #define rson m+1, r, rt<<1|1
18 #define mem1(a) memset(a, -1, sizeof(a))
19 #define mem2(a) memset(a, 0x3f, sizeof(a))
20 #define rep(i, n, a) for(int i = a; i<n; i++)
21 #define fi first
22 #define se second
23 typedef pair<int, int> pll;
24 const double PI = acos(-1.0);
25 const double eps = 1e-8;
26 const int mod = 1e9+7;
27 const int inf = 1061109567;
28 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
29 vector <pll> v[2000];
30 int de[2000], cnt, ans[2000], vis[2000];
31 void add(int a, int b, int c) {
32     v[a].pb(mk(c, b));
33     de[a]++;
34 }
35 void dfs(int u) {
36     int len = v[u].size();
37     for(int i = 0; i<len; i++) {
38         int to = v[u][i].second;
39         int e = v[u][i].fi;
40         if(vis[e])
41             continue;
42         vis[e] = 1;
43         dfs(to);
44         ans[cnt++] = e;
45     }
46 }
47 int main()
48 {
49     int a, b, c;
50     while(1) {
51         scanf("%d%d", &a, &b);
52         if(a+b==0)
53             break;
54         scanf("%d", &c);
55         for(int i = 1; i<1996; i++)
56             v[i].clear();
57         mem(de);
58         mem(vis);
59         cnt = 0;
60         add(a, b, c);
61         add(b, a, c);
62         while(1) {
63             scanf("%d%d", &a, &b);
64             if(a+b==0)
65                 break;
66             scanf("%d", &c);
67             add(a, b, c);
68             add(b, a, c);
69         }
70         int flag = 0;
71         for(int i = 1; i<=1995; i++) {
72             if(de[i]%2==1) {
73                 flag = 1;
74                 break;
75             }
76             sort(v[i].begin(), v[i].end());
77         }
78         if(flag) {
79             puts("Round trip does not exist.");
80             continue;
81         }
82         dfs(1);
83         for(int i = cnt-1; i>0; i--)
84             cout<<ans[i]<<" ";
85         cout<<ans[0]<<endl;
86     }
87     return 0;
88 }
原文地址:https://www.cnblogs.com/yohaha/p/5077848.html