Cod sursa(job #877427)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 12 februarie 2013 20:49:04
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#include <list>

using namespace std;

#define Nmax 100002

list <int> Graf[Nmax], lista;
vector <int> grad(Nmax);
stack <int> st;
bitset <Nmax> viz;

int N, M;

void citire(){

    ifstream f("ciclueuler.in");

    f >> N >> M;

    int a, b;

    for(; M; M--){
        f >> a >> b;

        Graf[a].push_back(b);
        Graf[b].push_back(a);

        grad[a]++;
        grad[b]++;
    }

    f.close();
}

void df(int nod){

    viz[nod] = 1;

    for(list <int> ::iterator it = Graf[nod].begin(); it != Graf[nod].end(); ++it)
        if(!viz[*it])
            df(*it);
}

int verifica(){

   for(int i = 1; i <= N; ++i)
        if(!viz[i] || grad[i] % 2)
            return 0;

    return 1;
}

void sterge(int a, int b){

    grad[a]--;
    grad[b]--;

    Graf[a].pop_front();

    for(list <int> ::iterator it = Graf[b].begin(); it != Graf[b].end(); ++it)
        if( *it == a ){

            Graf[b].erase(it);
            break;
        }
}

void euler(int nod){

    while(!Graf[nod].empty()){

        int a = Graf[nod].front();
        st.push(nod);
        sterge(nod, a);
        nod = a;
    }
}

void rezolva(){

    ofstream g("ciclueuler.out");

    int nod = 1;

    if(!verifica())
        g << -1 << "\n";

    else{
            do{
                euler(nod);
                nod = st.top();
                st.pop();
                lista.push_back(nod);

            }while(!st.empty());

            for(list <int> ::reverse_iterator it = lista.rbegin(); it != lista.rend(); ++it)
                g << *it << " ";

            g << "\n";
    }

    g.close();
}

int main(){

    citire();
    df(1);
    rezolva();

    return 0;
}