Cod sursa(job #1223698)

Utilizator tester_31tester tester_31 Data 28 august 2014 16:51:54
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<vector>
#include<algorithm>
using namespace std;

#define maxn 100005
vector <int> a[maxn];
vector <int> sol;

int i,n,m,x,y;
bool viz[maxn];

void dfs(int nod){
     viz[nod]=1;
     for(int j=0;j<(int)a[nod].size();j++)
       if(!viz[a[nod][j]]) dfs(a[nod][j]);
}

bool conex(){
     for(int i=1;i<=n;i++) viz[i]=0;
     dfs(1);
     for(int i=1;i<=n;i++)
       if(!viz[i]) return 0;
     return 1;
}

bool grade_pare(){
     for(int i=1;i<=n;i++)
       if(a[i].size()%2==1) return 0;
     return 1;
}

bool ciclu_eulerian(){
     if(grade_pare() && conex()) return 1;
     return 0;
}

void euler(int nod){
     
     if(a[nod].size()){
                       int vecin=a[nod].back();
                       a[nod].pop_back();
                       
                       a[vecin].erase(find(a[vecin].begin(),a[vecin].end(),nod));
                       euler(vecin);
                       if((int)sol.size()<m) sol.push_back(nod); 
                      }
     
     
}

void afisare(){
     euler(1);
     
     for(int j=0;j<(int)sol.size();j++)
       printf("%d ",sol[j]);
}

int main(){
    assert(freopen("ciclueuler.in","r",stdin));
    assert(freopen("ciclueuler.out","w",stdout));
    
    assert(scanf("%d %d",&n,&m)==2);
    
    for(i=1;i<=m;i++){
                      assert(scanf("%d %d",&x,&y)==2);
                      a[x].push_back(y);
                      a[y].push_back(x);
                     }
    
    if(ciclu_eulerian()) afisare();
    else printf("-1");
    
    fclose(stdin);
    fclose(stdout);
    return 0;
}