Cod sursa(job #1493761)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 29 septembrie 2015 21:12:02
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>

using namespace std;

#define N 100005
#define M 500005

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

struct muchie
{
    int x, y;
};

int n, m;
int lst[N], vf[2 * M], urm[2 * M], nr;
muchie muchii[M];
bool ok[M];

int cicluE[N], nCE;

int cNod(int x, int e)
{
    if(x == muchii[e].x)
        return muchii[e].y;
    return muchii[e].x;
}

void euler(int x)
{
    for(int i = lst[x]; i; i = urm[i])
    {
        int e = vf[i];
        if(!ok[e])
        {
            ok[e] = 1;
            int y = cNod(x, e);
            euler(y);
        }
    }
    cicluE[++nCE] = x;
}

int main()
{
    in >> n >> m;

    for(int i = 1; i <= m; i++)
    {
        int x, y;
        in >> x >> y;
        muchii[i].x = x;
        muchii[i].y = y;

        vf[++nr] = i;
        urm[nr] = lst[x];
        lst[x] = nr;
        vf[++nr] = i;
        urm[nr] = lst[y];
        lst[y] = nr;
    }

    for(int i = 1; i <= n; i++)
        euler(i);

    for(int i = 1; i <= m; i++)
        if(!ok[i])
        {
            out <<'-1\n';
            return 0;
        }

    for(int i = 1; i <= m; i++)
        out <<cicluE[i] << ' ';
    out << '\n';
    return 0;
}