Cod sursa(job #2562108)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 29 februarie 2020 12:21:06
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;

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

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

struct muchie{
    int x, y;
    bool sters;
};

muchie vm[M];
int nc, nr;
int edg[2*M], urm[2*M], lst[N];
int deg[N];
int ciclu[M];

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

int main()
{
    int n,m,i,start;
    bool eulerian;
    fin >> n >> m;
    for(i=0; i<m; i++){
        fin >> vm[i].x >> vm[i].y;
        start = vm[i].x;
        deg[vm[i].x]++, deg[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;
    }
    eulerian = true;
    for(i=1; i<=n; i++)
        if(deg[i]%2 == 1)
            eulerian = false;
    if(!eulerian)
        fout << "-1\n";
    else{
        dfs(start);
        for(i=0; i<nc-1; i++)
            fout << ciclu[i] << " ";
    }
    return 0;
}