Cod sursa(job #1815744)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 25 noiembrie 2016 18:34:57
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <stack>

#define NMAX 100005
#define MMAX 500005
using namespace std;
int N,M,grad[NMAX];
vector<int> graf[NMAX];
vector<int> ciclu;
struct muchie
{
    int nod1,nod2;
    bool used=0;
}v[MMAX];

void citire()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d",&v[i].nod1,&v[i].nod2);
        grad[v[i].nod1]++;
        grad[v[i].nod2]++;
        graf[v[i].nod1].push_back(i);
        graf[v[i].nod2].push_back(i);
    }
    for(int i=1;i<=M;i++)
    {
        if(grad[i]%2==1)
        {
            cout<<-1;
            exit(0);
        }
    }
}

stack<int> q;
void rezolvare()
{
    q.push(1);
    while(!q.empty())
    {
        int c = q.top();
        if(graf[c].size() && v[graf[c].back()].used == 1)
        {
                graf[c].pop_back();
        }
        else if(graf[c].size())
        {
            int x,i=graf[c].back();
            if(v[i].nod1==c)
                x = v[i].nod2;
            else
                x = v[i].nod1;
            graf[c].pop_back();
            v[i].used = 1;
            q.push(x);
        }
        else
        {
            ciclu.push_back(c);
            q.pop();
        }
    }
}

void afisare()
{
    for(vector<int>::iterator ii = ciclu.begin(); ii!= ciclu.end(); ii++)
    {
        printf("%d ",*ii);
    }
}
int main()
{
    freopen("ciclueuler.in","r",stdin);
    citire();
    rezolvare();
    afisare();

    return 0;
}