Cod sursa(job #1199153)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 18 iunie 2014 13:29:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <cstdio>
#include <list>
#include <vector>
using namespace std;
#define MAX 100001
struct muc{
    int x, y;
    bool ok;
} v[5*MAX];
int n, m;
bool vizitat[MAX];
vector <int> lista[MAX];
list <int> cic;
int euler();
int ciclu(list <int>::iterator it);
int main()
{
    int i, a ,b, ok;
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &a, &b);
        v[i].x = a; v[i].y = b;
        lista[a].push_back(i);lista[b].push_back(i);
    }
    euler();
    ok = 1;
    for(i=2; i<=n; i++)
        if(!vizitat[i]) {ok = 0;}
    for(i=1; i<=m; i++)
        if(!v[i].ok) {ok = 0;}
    if(ok==0)
        printf("-1\n");
    else{
        cic.pop_back();
        for(list<int>::iterator it=cic.begin(); it!=cic.end(); it++)
            printf("%d ", *it);
    }
    return 0;
}
int euler(){
    int cod;
    list<int>::iterator it;
    cic.push_back(1);
    it = cic.begin();
    do{
        cod = ciclu(it);
        if(cod==0) return 0;
        if(cod==2) it--;
    }while(it!=cic.begin());
}
int ciclu(list <int>::iterator it){
    int a, b, nod, start;
    nod = start = *it;
    while(!lista[nod].empty() and v[lista[nod].back()].ok) lista[nod].pop_back();
    if(lista[start].empty()) return 2; //ciclu vid
    do{
        while(!lista[nod].empty() and v[lista[nod].back()].ok)
            lista[nod].pop_back();
        if(lista[nod].empty()) return 0;
        else{
            a = v[lista[nod].back()].x;
            b = v[lista[nod].back()].y;
            v[lista[nod].back()].ok = true;
            if(nod==a) nod = b;
            else nod = a;
            vizitat[nod] = true;
            it = cic.insert(it, nod);
        }
    }while(nod!=start);
    return 1;
}