Cod sursa(job #1198847)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 17 iunie 2014 13:16:39
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
using namespace std;
#define MAX 100001
struct muc{
    int x, y;
    bool ok;
} v[MAX];
int sol[5*MAX], vf, n, m, rez;
vector <int> lista[MAX];
int euler();
int main()
{
    int i, a ,b;
    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);
    }
    rez = euler();
    if(rez==1)
        for(i=1; i<vf; i++) printf("%d ", sol[i]);
    else printf("1\n");
    return 0;
}
int euler(){
    int a, b;
    vf = sol[1] = 1;
    while(!lista[sol[vf]].empty()){
        while(!lista[sol[vf]].empty() and v[lista[sol[vf]][lista[sol[vf]].size()-1]].ok)
            lista[sol[vf]].pop_back();
        if(!lista[sol[vf]].empty()){
            a = v[lista[sol[vf]][lista[sol[vf]].size()-1]].x;
            b = v[lista[sol[vf]][lista[sol[vf]].size()-1]].y;
            v[lista[sol[vf]][lista[sol[vf]].size()-1]].ok = true;
            if(sol[vf]==a) sol[vf+1] = b;
            else sol[vf+1] = a;
            vf++;
        }
    }
    if(vf==m+1) return 1;
    return 0;
}