Advertisement
frentzy

EULERIAN

Jan 14th, 2019
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define NMAX 200
  4. #define MMAX 19900
  5.  
  6. typedef struct stack {
  7.           int top;
  8.           int a[MMAX];
  9.         } STACK;
  10.  
  11. char vecin[NMAX + 1][NMAX + 1];
  12. int d[NMAX + 1];
  13. STACK stk;
  14. int path[MMAX + 1];
  15. int pathlen;
  16.  
  17.  
  18. void init(STACK* s) {
  19.   s->top = -1;
  20. }
  21.  
  22. int empty(STACK* s) {
  23.   return (s->top < 0) ? 1 : 0;
  24. }
  25.  
  26. void push(STACK* s, int x) {
  27.   s->top++;
  28.   s->a[s->top] = x;
  29. }
  30.  
  31. int peek(STACK* s) {
  32.   return s->a[s->top];
  33. }
  34.  
  35. void pop(STACK* s) {
  36.   s->top--;
  37. }
  38.  
  39. void findeulerpath(int n, int startNode) {
  40.   int u, v;
  41.  
  42.   u = startNode;
  43.   init(&stk);
  44.   pathlen = 0;
  45.  
  46.   push(&stk, u);
  47.   while (!empty(&stk)) {
  48.     u = peek(&stk);
  49.     pop(&stk);
  50.  
  51.     v = 1;
  52.     while ((d[u] > 0) && (v <= n)) {
  53.       if (vecin[u][v] == 1) {
  54.         push(&stk, u);
  55.  
  56.         vecin[u][v] = vecin[v][u] = 0;
  57.         d[u]--;
  58.         d[v]--;
  59.  
  60.         u = v;
  61.         v = 1;
  62.       } else {
  63.           v++;
  64.       }
  65.     }
  66.  
  67.     path[pathlen++] = u;
  68.   }
  69. }
  70.  
  71.  
  72. int main() {
  73.   FILE *fin, *fout;
  74.   int n, u, v, i;
  75.  
  76.   fin = fopen("euler.in", "r");
  77.   fout = fopen("euler.out", "w");
  78.  
  79.   fscanf(fin, "%d", &n);
  80.   while (fscanf(fin, "%d %d", &u, &v) == 2) {
  81.     vecin[u][v] = vecin[v][u] = 1;
  82.     d[u]++;
  83.     d[v]++;
  84.   }
  85.  
  86.   findeulerpath(n, 1);
  87.  
  88.   fprintf(fout, "%d\n", pathlen);
  89.   for (i = 0; i < pathlen; i++) {
  90.     fprintf(fout, "%d ", path[i]);
  91.   }
  92.  
  93.   fclose(fin);
  94.   fclose(fout);
  95.  
  96.   return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement