Cod sursa(job #1133552)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 4 martie 2014 23:49:59
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <list>
#include <vector>

using namespace std;

struct muchie
{
    int a,b;
    bool viz;
};

#define NMAX 100005
int deg[NMAX];
vector<muchie*> graf[NMAX];
list<int> sol;
list<int>::iterator unde;
int tata[NMAX];
int marime[NMAX];

int f(int x)
{
    if(tata[x]!=x)
        tata[x]=f(tata[x]);
    return tata[x];
}

inline void uneste(int a,int b)
{
    a=f(a),b=f(b);
    marime[b]+=marime[a];
    tata[a]=b;
}

void expand(int nod)
{
    while(1)
    {
        while(graf[nod].size() && (*(graf[nod].end()-1))->viz==1)
            graf[nod].pop_back();

        if(graf[nod].size())
        {
            (*(graf[nod].end()-1))->viz=1;
            nod=(*(graf[nod].end()-1))->a+(*(graf[nod].end()-1))->b-nod;
            sol.insert(unde,nod);
        }
        else
            break;
    }
}

ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");

void euler()
{
    sol.push_back(1);
    for(list<int>::iterator it=sol.begin();it!=sol.end();it++)
    {
        cout<<*it<<' ';
        it++;
        unde=it;
        it--;
        expand(*it);
    }
    cout<<'\n';
}

int main()
{
    int n=0,m=0,i,a,b;

    cin>>n>>m;
    for(i=1;i<=n;i++)
        tata[i]=i,marime[i]=1;

    for(i=0;i<m;i++)
    {
        muchie *x;
        x=new muchie;

        cin>>a>>b;
        x->a=a;
        x->b=b;
        x->viz=0;

        uneste(a,b);
        deg[a]++;
        deg[b]++;
        graf[a].push_back(x);
        graf[b].push_back(x);
    }

    bool ok=true;
    for(i=1;i<=n;i++)
    {
        if(marime[i]>1)
            if(f(i)!=f(1))
            {
                ok=false;
                break;
            }
        if(deg[i]&1)
        {
            ok=false;
            break;
        }
    }

    if(!ok)
    {
        cout<<"-1\n";
        cin.close();
        cout.close();
        return 0;
    }

    euler();

    cin.close();
    cout.close();
    return 0;
}