Cod sursa(job #1146121)

Utilizator denis_tdrdenis tdr denis_tdr Data 18 martie 2014 18:40:45
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<iostream>
#include <fstream>
#include <list>
#include <stack>
#define pb push_back

using namespace std;

list<int> V[100002];
stack<int> S;
list<int> L;
bool grad[100002];
int n, m, x, y;
ofstream g("ciclueuler.out");

void read(){
    ifstream f("ciclueuler.in");
    f>>n>>m;
    for(int i=0; i<m; i++)
    {
        f>>x>>y;
        V[x].push_back(y);
        if(x!=y)
            V[y].push_back(x);
        grad[x]=!grad[x];
        grad[y]=!grad[y];
    }
}

void er_muchie(int a, int b){
    V[a].pop_front();
    if(a==b)return;
    for(list<int>::iterator it=V[b].begin(); it!=V[b].end(); it++)
        if(*it==a)
        {
            V[b].erase(it);
            return;
        }
}
void euler1(int nod){
    int x0=nod;
    while(true){
        if(!V[nod].size())
           return;
        x0=V[nod].front();
        er_muchie(nod, x0);
        S.push(nod);
        nod=x0;
    }
}
int v;
void rez(){
    v=1;
    do{
        euler1(v);
        v=S.top(); S.pop();
        g<<v<<" ";
    }while(!S.empty());
}
int main(){
    read();
    for(int i=1;i<=n;i++)
        if(grad[i]){
            g<<-1;
            g<<-1;
            return 0;
        }
    rez();
    return 0;
}