Cod sursa(job #357372)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 19 octombrie 2009 02:18:22
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>
using namespace std;
struct lista{int nod;lista *next;} *v[100005],*s=NULL;
int deg[100005],cic[100004],nrcic=0,nr=0,n,m;;
char viz[100005];
void adauga(lista* &l,int x)
{lista *q=new lista;
q->nod=x;
q->next=l;
l=q;
     
     }
void pop(lista* &l,int &x)
{ lista *q=l;
x=q->nod;
l=l->next;
 delete q;    
     }
void sterge(int x,int y)
{lista *q=v[x];
lista *pg=NULL;
 while(q)
  {if(q->nod==y) 
    {if(pg) pg->next=q->next;  
     else  v[x]=q->next;
     delete q; return;  }
     pg=q;q=q->next;    
       
         }
    
    
     }          
int dfs(int x)
{nr++;
viz[x]=1;
for(lista *p=v[x];p!=NULL;p=p->next)
 if(!viz[p->nod])
  {viz[p->nod]=1;
 dfs(p->nod);}

} 

int eulerian()
{dfs(1);
if(n!=nr) return 0;
for(int i=1;i<=n;i++) if(deg[i]%2==1)  return 0;
return 1;     
     
     }
int euler()
{int x,nd=1;
     do
      {if(v[nd])
      {pop(v[nd],x);
      sterge(x,nd);
      adauga(s,nd);
      nd=x;}
      else {cic[++nrcic]=nd;
            pop(s,nd);}
                                                  
                   }
     while(s);     
     }

    
       
int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&n,&m);
int a,b;
for(int i=1;i<=n;i++) {deg[i]=viz[i]=0;v[i]=NULL;}
for(int i=1;i<=m;i++)
 {scanf("%d %d",&a,&b); adauga(v[a],b);adauga(v[b],a);deg[a]++;deg[b]++;}
int v=eulerian();
 if(v!=1) printf("%d",-1);
 else {euler();for(int i=1;i<nrcic;i++) printf("%d ",cic[i]);} 
    return 0;
    }