Cod sursa(job #1829673)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 15 decembrie 2016 15:18:39
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;

int n,m;

vector<int> graf[100001];
stack<int> st;
vector<pair<int, int> >muchii;
bool viz[200001];

void citire()
{
    scanf("%d %d",&n,&m);
    for(int i=0; i<m; i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        graf[x].push_back(i);
        graf[y].push_back(i);
        muchii.push_back(make_pair(x,y));
        viz[i]=1;
    }
}

bool verficare()
{
    for(int i=1; i<=n; i++)
        if(graf[i].size()%2==1)
            return 0;

    return 1;
}

void ciclu()
{
    st.push(1);
    while(!st.empty())
    {
        int nod=st.top();
        if(graf[nod].size())
        {
            int vecin=graf[nod].back();
            graf[nod].pop_back();
            if(viz[vecin])
            {
                if(muchii[vecin].first == nod)
                    st.push(muchii[vecin].second);
                else st.push(muchii[vecin].first);
                viz[vecin]=0;
            }
        }
        else
        {
            printf("%d ",nod);
            st.pop();
        }
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    if(!verficare())
        printf("-1");
    else
        ciclu();

    return 0;
}