Cod sursa(job #1505342)

Utilizator dorupopDoru Pop dorupop Data 19 octombrie 2015 00:37:11
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
vector <int> G[100001];
int viz[500001], n,m,x,y,i,N,vf;
stack <int> st;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
void df(int k){
   viz[k]=1;
   for(int i=0;i<G[k].size();i++)
       if(!viz[G[k][i]])
            df(G[k][i]);
}
void euler(int k){
   st.push(k);
   while(!st.empty()){
        k=st.top();
        if(G[k].size()>0)
           {
               int nou=G[k].back();
               st.push(nou);

               //G[nou].erase(find(G[nou].begin(),G[nou].end(),k));
               G[nou].erase(find(G[nou].begin(), G[nou].end(), k));
                G[k].pop_back();
           }
           else
               {
                   viz[++N]=k;
                   st.pop();
                                  }

   }

}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++){
         f>>x>>y;
         G[x].push_back(y);
         G[y].push_back(x);
      }
      for(int i=1;i<=n;i++)
         if(G[i].size()&1){
           g<<-1;
           return 0;
         }
     for(i=1;i<=n;i++)
         if(G[i].size()>0)
             {
                vf=i;
                df(i);
                break;
             }
    for(i=1;i<=n;i++)
       if(viz[i]==0&&G[i].size()>0){
          g<<-1;
          return 0;
       }
     euler(vf);

for(i=1;i<N;i++)
  g<<viz[i]<<" ";
    return 0;
}