Cod sursa(job #579165)

Utilizator sodamngoodSo Damn Good sodamngood Data 11 aprilie 2011 21:42:52
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
#define maxn 100010

int N, M;
int deg[maxn], viz[maxn];
vector<int> G[maxn], ciclu;
stack<int> stiva;

void BFS(int nod) {
    queue<int> Q;
    Q.push(nod); viz[nod] = 1;
    while(!Q.empty()) {
         int nod = Q.front(); Q.pop();
         for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
              if(!viz[*it]) {
                   viz[*it] = 1;
                   Q.push(*it);
              }
         }
    }
}

void sterge(int nod1, int nod2) {
    vector<int>::iterator it;
    for(it=G[nod1].begin(); it!=G[nod1].end(); it++) {
         if((*it) == nod2) break;
    }
    G[nod1].erase(it);
}

int main() {
    FILE *f1=fopen("ciclueuler.in", "r"), *f2=fopen("ciclueuler.out", "w");
    int i, j, p, q;

    fscanf(f1, "%d %d\n", &N, &M);
    for(i=1; i<=M; i++) {
         fscanf(f1, "%d %d\n", &p, &q);
         G[p].push_back(q);
         G[q].push_back(p);
         deg[p] ++; deg[q] ++;
    }

    //verific daca e conex
    int nrcc = 0;
    for(i=1; i<=N; i++) {
         if(!viz[i]) {
              nrcc ++;
              BFS(i);
         }
    }

    if(nrcc > 1) {
         fprintf(f2, "-1\n");
         return 0;
    }

    //verific daca toate nodurile au grad par
    for(i=1; i<=N; i++) {
         if(deg[i] % 2 == 1) {
              fprintf(f2, "-1\n");
              return 0;
         }
    }

    //acum pot face in pace ciclul
    stiva.push(1);
    while(stiva.size()) {
         int nod = stiva.top();
         if(!G[nod].size()) {
              stiva.pop();
              ciclu.push_back(nod);
         }
         else {
              int nod1 = G[nod][0];
              sterge(nod, nod1);
              sterge(nod1, nod);
              stiva.push(nod1);
         }
    }

    for(i=1; i<ciclu.size(); i++) {
         fprintf(f2, "%d ", ciclu[i]);
    } fprintf(f2, "\n");

    fclose(f1); fclose(f2);
    return 0;
}