Cod sursa(job #1248842)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 26 octombrie 2014 09:03:56
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <bitset>
#include <stack>
#include <queue>
#include <list>
#define DIM 100011
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m;
int D[DIM];

list<int> L[DIM],sol;
stack<int> S;
queue<int> Q;
bitset<DIM> viz;

inline bool conex(){
    list<int>::iterator it;
    int nod,nr=1;
    Q.push(1),viz[1]=1;
    while(!Q.empty()){
        nod=Q.front(),Q.pop();
        for(it=L[nod].begin();it!=L[nod].end();it++)
            if(!viz[*it]) Q.push(*it),viz[*it]=1,nr++;
    }
    if(nr==n)
        return true;
    else{
        for(register int i=1;i<=n;i++)
            if(!viz[i]&&D[i])
                return false;
        return true;
    }
}

void stergere(int x,int y){
    list<int>::iterator it;
    D[x]--,D[y]--;
    L[x].pop_front();
    for(it=L[y].begin();it!=L[y].end();it++)
        if(*it==x){
            L[y].erase(it);
            break;
        }
}

void euler(int nod){
    int w;
    while(!L[nod].empty()){
        w=L[nod].front();
        stergere(nod,w);
        S.push(nod),nod=w;
    }
}


int main(void){
    register int i,j,x,y,nr=0;
    list<int>::iterator it;

    f>>n>>m;
    for(i=1;i<=m;i++)
        f>>x>>y,L[x].push_back(y),L[y].push_back(x),D[x]++,D[y]++;

    for(i=1;i<=n;i++)
        if(D[i]%2){
            g<<"-1";
            f.close(),g.close();
            return 0;
        }
    if(!conex()){
        g<<"-1";
        return 0;
    }

    int nod=1;
    viz.reset();
    for(i=1;i<=n;i++) if(!D[i]) sol.push_front(i);
    do{
        euler(nod);
        nod=S.top(),S.pop();
        sol.push_front(nod);
    }while(!S.empty());
    for(it=sol.begin();it!=sol.end();it++)
        g<<*it<<" ";

    f.close(),g.close();
    return 0;
}