Cod sursa(job #1249723)

Utilizator thewildnathNathan Wildenberg thewildnath Data 27 octombrie 2014 13:09:33
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include<stdio.h>
#include<queue>
#include<vector>
#include<stack>

using namespace std;

#define NMAX 100002
#define MMAX 500010

int n, m, fin;
int gr[NMAX];
bool viz[NMAX], ok;

int lcaux, aux[MMAX], nrs, sol[MMAX];

queue<int> q;
vector<int> v[NMAX], ch;
stack<int> st;

void bfs()
{
    int nod;

    viz[1]=1;
    q.push(1);

    while(!q.empty())
    {
        nod=q.front();
        q.pop();

        for(int i=0; i<v[nod].size(); ++i)
        {
            if(!viz[v[nod][i]])
            {
                viz[v[nod][i]]=1;

                q.push(v[nod][i]);
            }
        }
    }
}

bool verific()
{
    for(int i=1; i<=n; ++i)
        if(gr[i]%2)
            return 0;

    bfs();

    for(int i=2; i<=n; ++i)
        if(!viz[i])
            return 0;

    return 1;
}

inline void sterge_muchie(int &a, int &b)
{
    --gr[a];
    --gr[b];

    for(int i=0; i<v[a].size(); ++i)
        if(v[a][i]==b)
        {
            v[a][i]=0;
            break;
        }

    for(int i=0; i<v[b].size(); ++i)
        if(v[b][i]==a)
        {
            v[b][i]=0;
            break;
        }
}

void dfs(int nod)
{
    int fiu;

    for(int i=0; i<v[nod].size() && !ok; ++i)
    {
        fiu=v[nod][i];

        if(fiu)
        {
            sterge_muchie(nod, fiu);

            aux[++lcaux]=fiu;

            if(fiu==fin)
            {
                ok=1;
                return;
            }

            dfs(fiu);
        }
    }

    if(!ok)
        --lcaux;
}

void rez()
{
    if(!verific())
    {
        printf("-1\n");

        return;
    }

    int nod=1;

    ch.push_back(1);

    for(int i=0; i<ch.size(); ++i)
    {
        sol[++nrs]=ch[i];

        while(gr[ch[i]])
        {
            lcaux=0;
            fin=ch[i];
            ok=0;

            dfs(ch[i]);

            for(int j=1; j<=lcaux; ++j)
                ch.insert(ch.begin()+i+j, aux[j]);
        }
    }

    for(int i=1; i<nrs; ++i)
        printf("%d ", sol[i]);
    printf("\n");
}

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    int x, y;

    scanf("%d%d", &n, &m);

    for(int i=1; i<=m; ++i)
    {
        scanf("%d%d", &x, &y);

        v[x].push_back(y);
        v[y].push_back(x);

        ++gr[x];
        ++gr[y];
    }

    rez();

    return 0;
}