Cod sursa(job #653254)

Utilizator bacilaBacila Emilian bacila Data 27 decembrie 2011 18:09:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <list>
#include<stack>
#include <cstdio>
using namespace std;
FILE *g,*f;

list<int> v[100005];
stack<int> stk;
list<int>::iterator it;
int n,m,x,y,c[100005],next;
void dfss(int nod)
{c[nod]=1; x++;
list<int>::iterator it;
    for( it=v[nod].begin();it!=v[nod].end();it++)
    if(!c[*it])
    dfss(*it);
    }
int main ()
{int i;
    f=fopen("ciclueuler.in","r");
    g=fopen("ciclueuler.out","w");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=m;i++)
{fscanf(f,"%d %d",&x,&y);
                   v[x].push_back(y);
v[y].push_back(x);}
for(i=1;i<=n;i++)
if(v[i].size()%2){ fprintf(g,"-1"); return 0;}
x=0;
dfss(1);
if(x!=n)           fprintf(g,"-1");
else
{x=v[1].front();
v[1].pop_front();
for(it=v[x].begin();it!=v[x].end();it++)
if(*it==1) {v[x].erase(it); break;}
stk.push(x);
while(!stk.empty())
{   
 while(!v[stk.top()].empty())
         {next=v[stk.top()].front();
                       v[stk.top()].pop_front();
                      
                      for( it=v[next].begin();it!=v[next].end();++it)
                                 if(*it==stk.top()) {v[next].erase(it); break;}
                                 
                                
                                 stk.push(next);
                                 
                                 }
    fprintf(g,"%d ",stk.top());  
     stk.pop();
     }
 }

 


 fclose(f); fclose(g);
return 0;
}