Cod sursa(job #1180732)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 30 aprilie 2014 23:58:24
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<vector>
#define maxn 100005
using namespace std;
ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");

vector <int> a[maxn];
int i,n,m,x,y,nr;
bool viz[maxn];

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

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

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

void euler(int nod){
     int i,vecin;
     
     while(a[nod].size())
        {
         vecin=a[nod].back();
         a[nod].pop_back();
         
         i=(int)a[vecin].size()-1; 
         while(i>=0 && a[vecin][i]!=nod) i--;
         a[vecin][i]=a[vecin].back();
         a[vecin].pop_back(); 
             
         euler(vecin);
        }
     nr++;
     if(nr<=m) fo<<nod<<" ";
}

int main(){
    fi>>n>>m;
    for(i=1;i<=m;i++){
                      fi>>x>>y;
                      a[x].push_back(y);
                      a[y].push_back(x);
                     }
    
    if((!conex(n)) || (!par(n))) fo<<"-1";
    else euler(1);
    
    fi.close();
    fo.close();
    return 0;
}