Cod sursa(job #1736230)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 1 august 2016 14:15:24
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>

#define NMAX 100005

using namespace std;

int N,M;
int grad[NMAX];
vector<int> graf[NMAX];
vector<int> ciclu;

stack<int> s;

void citire()
{
    scanf("%d%d",&N,&M);
    for(int i=1; i<=M; i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        graf[x].push_back(y);
        graf[y].push_back(x);
        grad[x]++;
        grad[y]++;
    }
}

int grade()
{
    for(int i=1; i<=N; i++)
        if(grad[i]%2)
            return 0;
    return 1;
}

void elim(int n1,int n2)
{
    graf[n1].erase(find(graf[n1].begin(),graf[n1].end(),n2));
    graf[n2].erase(find(graf[n2].begin(),graf[n2].end(),n1));
    grad[n1]--;
    grad[n2]--;
}

void euler()
{
    s.push(1);
    while(!s.empty())
    {
        int c = s.top();
        if(grad[c])
        {
            int x = graf[c].back();
            elim(x,c);
            s.push(x);
        }
        else
        {
            ciclu.push_back(c);
            s.pop();
        }
    }
}

void afis()
{
    for(vector<int>::iterator ii = ciclu.begin(); ii!= ciclu.end(); ii++)
    {
        printf("%d ",*ii);
    }
}


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

    citire();
    if(grade())
    {
        euler();
        afis();
    }
    else
    {
        printf("-1");
    }

    return 0;
}