Cod sursa(job #698972)

Utilizator giuliastefGiulia Stef giuliastef Data 29 februarie 2012 17:03:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
// ciclu eulerian

#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#define NMAX 100011
using namespace std;
vector <int> G[NMAX];
queue <int> Q;
stack <int> S;
vector <int>::iterator it;
int N;
int grad[NMAX],viz[NMAX];
void Read(){
     int x,y,M;
     ifstream in("ciclueuler.in");
     in>>N>>M;
     for(;M>0;M--){
      in>>x>>y;
      G[x].push_back(y);
      G[y].push_back(x);
      grad[x]++;
      grad[y]++;
     }
     in.close();
}
bool Conex(){
     int x,Nr=0;
     Q.push(1);
     while(!Q.empty()){
      x=Q.front();
      Q.pop();
      for(it=G[x].begin();it!=G[x].end();it++)
       if(!viz[*it]){
        viz[*it]=1;
        Nr++;
        Q.push(*it);
       }
     }
     if(Nr==N) return 1;
     return 0;  
}
bool Par(){
    for(int i=1;i<=N;i++)
     if(grad[i]%2) return 0;
    return 1; 
}
void Erase(int x, int y){
     int i;
     grad[x]--; grad[y]--;
     for(it=G[x].begin();it!=G[x].end();it++) 
      if(*it==y){
       G[x].erase(it);
       break;
      }
     for(it=G[y].begin();it!=G[y].end();it++)
      if(*it==x){
       G[y].erase(it);
       break;
      }
}
void Euler(int x){
     while(1){
      if(G[x].size()==0) break;
      int y=G[x][0];
      S.push(x);
      Erase(x,y);
      x=y;
     }
}
void Solve(int x){
     do{
      Euler(x);
      x=S.top();
      S.pop();
      Q.push(x);
     }
     while(!S.empty());
}
void Write(){
     ofstream out("ciclueuler.out");
     int conex,par;
     conex=Conex();
     par=Par();
     if(conex&&par){
      Solve(1);
      while(!Q.empty()){
       out<<Q.front()<<" ";
       Q.pop();
      }
     }
     else out<<"-1\n";
     out.close();
}
int main(){
    Read();
    Write();
    return 0;
}