标签:
求给出的图是否存在欧拉回路并输出路径, 从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 }
标签:
原文地址:http://www.cnblogs.com/yohaha/p/5077848.html