BotByte

Euler tour

May 20th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX 7
  6. vector<int> adj[MAX][MAX];
  7. int deg[MAX];
  8. bool vis[MAX];
  9.  
  10. bool dfs(int u, int v)
  11. {
  12.     if(u == v) return true;
  13.     vis[u] = true;
  14.     for(int i=0; i<MAX; i++){
  15.         if(adj[u][i].size() > 0 || adj[i][u].size() > 0 && vis[i] == false){
  16.             if(dfs(i, v)) return true;
  17.         }
  18.     }
  19.     return false;
  20. }
  21.  
  22. bool is_connected()
  23. {
  24.     memset(vis, false, sizeof vis);
  25.     for(int i=0; i<MAX; i++){
  26.         if(deg[i] > 0){
  27.             dfs(i, -1);
  28.             break;
  29.         }
  30.     }
  31.     for(int i=0; i<MAX; i++){
  32.         if(deg[i] > 0 && vis[i] == false) return false;
  33.     }
  34.     return true;
  35. }
  36.  
  37. int main()
  38. {
  39.     int n;
  40.     scanf("%d", &n);
  41.     memset(deg, 0, sizeof deg);
  42.     for(int i=0; i<n; i++){
  43.         int u, v;
  44.         scanf("%d %d", &u, &v);
  45.         deg[u]++;
  46.         deg[v]++;
  47.         adj[u][v].push_back(i+1);
  48.     }
  49.     int odd = 0, curNode = -1;
  50.     for(int i=0; i<MAX; i++){
  51.         if(deg[i]%2 == 1){
  52.             odd++;
  53.             curNode = i;
  54.         }
  55.     }
  56.     if((odd != 0 && odd != 2) || is_connected()){
  57.         printf("-1");
  58.         return 0;
  59.     }
  60.     if(odd == 0){
  61.         for(int i=0; i<MAX; i++){
  62.             if(deg[i] != 0){
  63.                 curNode = i;
  64.                 break;
  65.             }
  66.         }
  67.     }
  68.     for(int i=0; i<n; i++){
  69.         bool forwrd;
  70.         for(int j=0; j<MAX; j++){
  71.             int selected_ind;
  72.             if(adj[curNode][j].size() > 0 || adj[j][curNode].size() > 0){
  73.                 if(adj[curNode][j].size() > 0){
  74.                     selected_ind = adj[curNode][j].back();
  75.                     adj[curNode][j].pop_back();
  76.                     forwrd = true;
  77.                 }
  78.                 else {
  79.                     selected_ind = adj[j][curNode].back();
  80.                     adj[j][curNode].pop_back();
  81.                     forwrd = false;
  82.                 }
  83.                 deg[curNode]--;
  84.                 deg[j]--;
  85.                 memset(vis, 0, sizeof vis);
  86.                 if(deg[curNode] == 0 || dfs(curNode, j) == true){
  87.                     curNode = j;
  88.                     printf("%d %c\n", selected_ind, forwrd ? '+' : '-');
  89.                     break;
  90.                 }
  91.                 else {
  92.                     deg[curNode]++;
  93.                     deg[j]++;
  94.                     if(forwrd) adj[curNode][j].push_back(selected_ind);
  95.                     else adj[j][curNode].push_back(selected_ind);
  96.                 }
  97.             }
  98.         }
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment