Cod sursa(job #2562123)

Utilizator kodama cheama alex koda Data 29 februarie 2020 12:23:30
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

const int N = 100001;
const int M = 500001;

struct muchie {
    int x, y;
    bool sters;
}; muchie vm[M];

int urm[2*M], edg[2*M], lst[N], nr;
int ciclu[M+1], nc;
bool found[N];

void dfs (int x) {
    muchie e;
    int y;
    for ( int p = lst[x]; p != 0; p = urm[p] ) {
        e = vm[edg[p]];
        if ( e.sters ) continue;
        y = e.x + e.y - x;
        vm[edg[p]].sters = true;
        lst[x] = urm[p];
        dfs(y);
    }
    ciclu[nc++] = x;
    found[x] = true;
}

int main() {
    ifstream fin ("ciclueuler.in");
    ofstream fout ("ciclueuler.out");
    int n, m;
    fin>>n>>m;
    for ( int i = 0; i < m; i++ ) {
        fin>>vm[i].x>>vm[i].y;

        edg[++nr] = i;
        urm[nr] = lst[vm[i].x];
        lst[vm[i].x] = nr;

        edg[++nr] = i;
        urm[nr] = lst[vm[i].y];
        lst[vm[i].y] = nr;
    }

    ciclu[nc++] = 1;
    dfs(1);

    int c;
    for ( c = 1; c < n && found[c]; c++ ) {}

    if ( c == n )
        for ( int i = 1; i < nc-1; i++ )
            fout<<ciclu[i]<<" ";
    else
        fout<<"-1";
}