Cod sursa(job #884588)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 21 februarie 2013 00:55:37
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<fstream>
#include<bitset>
#include<vector>
#define dim 500002
using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
bitset<dim>viz,Viz;
vector< pair < int , int > > G[dim];
int st[dim];
int x,y,i,j,k,n,m;
int gr[dim];
void dfs(int x) {
    viz[x]=1;

    for(int i=0;i<G[x].size();++i){
        if(!viz[G[x][i].first])
            dfs(G[x][i].first);
    }

}
int main () {

    f>>n>>m;

    for(i=1;i<=m;++i){

        f>>x>>y;
        G[x].push_back(make_pair(y,i));
        G[y].push_back(make_pair(x,i));
        ++gr[x];
        ++gr[y];

    }
    dfs(1);
    int ok=1;
    for(i=1;i<=n;++i){
        if( !viz[i] || gr[i]%2  )
                ok=0;
    }

    if(!ok){
        g<<"-1\n";
        return 0;
    }
    st[++k]=1;
    for(;k;)  {

        if(G[st[k]].size()==0) {
            //daca golim lista varfului,afisam vf si il scoatem din stiva
           g<<st[k--]<<" ";
            continue;

        }
        if( Viz[G[st[k]][G[st[k]].size()-1].second]==1 ) {
            //daca muchia a fost deja stearsa scoatem nodul adiacent din lista vf
            G[st[k]].pop_back();
        }
        else {
            ++k;
            //punem in vf stivei ultimul nod adiacent din lista vf actual
            st[k]=G[st[k-1]][G[st[k-1]].size()-1].first;
            //marcam muchia respectiva
            Viz[G[st[k-1]][G[st[k-1]].size()-1].second]=1;

        }
    }
    return 0;

}