Cod sursa(job #2131774)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 14 februarie 2018 22:29:47
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>
#define nmax 100005
using namespace std;

FILE *f=fopen("ciclueuler.in","r");
FILE *g=fopen("ciclueuler.out","w");

struct str
{
    int nod,indic;
};

vector<str>Q[nmax];
vector<int>Stk;

int n,m,stkcount,grad[nmax],sters[nmax];

void read()
{
    fscanf(f,"%d %d",&n,&m);
    for (int i=1; i<=m; ++i)
    {
        int e1,e2;
        fscanf(f,"%d %d",&e1,&e2);
        Q[e1].push_back({e2,i});
        Q[e2].push_back({e1,i});
        ++grad[e1];
        ++grad[e2];
    }
}

bool verify()
{
    for (int i=1; i<=n; ++i)
        if (grad[i]&1)
            return 0;
    return 1;
}

void solve()
{
    Stk.push_back(1);
    while (!Stk.empty())
    {
        int nod=Stk.back();
        while (!Q[nod].empty()&&sters[Q[nod].back().indic])
            Q[nod].pop_back();
        if (Q[nod].empty())
        {
            if (Stk.size()!=1)
                fprintf(g,"%d ",nod);
            Stk.pop_back();
        }
        else
        {
            int nextnod=Q[nod].back().nod;
            int nextindic=Q[nod].back().indic;
            sters[nextindic]=1;
            Q[nod].pop_back();
            Stk.push_back(nextnod);
        }
    }
}

int main()
{
    read();
    if (verify())
        solve();
    else
    {
        fprintf(g,"-1");
        return 0;
    }
    fclose(f);
    fclose(g);
    return 0;
}