Cod sursa(job #1876367)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 12 februarie 2017 12:16:45
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cstdio>
#include <vector>
#define Nmax 100001
using namespace std;

ofstream g("ciclueuler.out");

int n,nr,m,ok;
bool viz[Nmax];
struct mc{
    int nod, poz;
    bool viz;
};

vector<mc> V[Nmax];

void dfs(int nod)
{
    viz[nod] = 1;
    nr++;
    for (int i=0;i<V[nod].size();i++)
        if (!viz[V[nod][i].nod])
        {
            viz[V[nod][i].nod] = 1;
            dfs(V[nod][i].nod);
        }
}
bool conex()
{
    dfs(1);
    if (nr==n)
        return 1;
    return 0;
}

void euler(int nod)
{
    for (int i=0;i<V[nod].size();i++)
    {
        if (!V[nod][i].viz)
        {
            V[nod][i].viz = 1;
            V[V[nod][i].nod][V[nod][i].poz].viz = 1;
            euler(V[nod][i].nod);
        }
    }
    if (ok==0)
        ok=1;
    else
        g<<nod<<' ';
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        mc crt;
        crt.viz = 0;
        crt.nod = y;
        crt.poz = V[y].size();
        if (x==y)
            crt.poz++;
        V[x].push_back(crt);
        crt.nod = x;
        crt.poz = V[x].size()-1;
        V[y].push_back(crt);
    }

    for (int i=1;i<=n;i++)
    {
        if (V[i].size()%2==1)
        {
            g<<-1;
            return 0;
        }
    }
    if (!conex())
    {
        g<<-1;
        return 0;
    }

    euler(1);


    return 0;
}