Cod sursa(job #1249775)

Utilizator thewildnathNathan Wildenberg thewildnath Data 27 octombrie 2014 14:09:50
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 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];

    v[a].erase(v[a].begin());

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

void dfs(int nod)
{
    int fiu;

    while(v[nod].size())
    {
        st.push(nod);

        fiu=v[nod][0];

        sterge_muchie(nod, fiu);

        nod=fiu;
    }
}

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

        return;
    }

    int nod=1;

    do
    {
        dfs(nod);

        nod=st.top();
        st.pop();

        sol[++nrs]=nod;

    }while(!st.empty());


    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;
}