Cod sursa(job #1180738)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 1 mai 2014 00:21:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
#include<vector>
#include<stack>
#define maxn 100005
using namespace std;
ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");

vector <int> a[maxn];
stack <int> st;
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 i,nod,vecin;
     
     st.push(1);
     while(st.size())
        {
         nod=st.top();
         if(a[st.top()].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(); 
                                
                                st.push(vecin);
                               }  
         else{
              nr++;
              if(nr<=m) fo<<nod<<" ";
              st.pop();
             }
        }
}

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();
    
    fi.close();
    fo.close();
    return 0;
}