Cod sursa(job #1199788)

Utilizator azkabancont-vechi azkaban Data 20 iunie 2014 16:55:02
Problema Ciclu Eulerian Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
typedef struct celula {
                       long nod;
                       celula* next;
                       }*lista;
                       
void add(long nod, lista &p)
{
  lista r=new celula;
  r->nod=nod;
  r->next=p;
  p=r;
}

void dfs(long nod,long viz[],lista lda[])
{
 viz[nod]=1;
 lista r=lda[nod];
 while (r) {
            if (viz[r->nod]==0) dfs(r->nod,viz,lda);
            r=r->next;
           }
}


void euler(long nod,lista lda[])
{
 lista r,v;
 long key;
 if (lda[nod]!=0){
                  cout<<nod<<" ";
                  key=lda[nod]->nod;
                  lda[nod]=lda[nod]->next;
                  v=lda[key];
                  r=v;
                  if (lda[key]->nod==nod) lda[key]=lda[key]->next;
                                else 
                   while (v) { 
                              if (v->nod==nod){
                                               r->next=v->next;
                                               delete v;
                                               break;
                                               }
                              r=v;
                              v=v->next;
                              }
                   euler(key,lda);
                   }
}


long n,i,j,valid,m,a,b;
long viz[100013],RG[100013];
lista lda[100013];

int main()
{
memset(lda,0,sizeof(lda));
memset(viz,0,sizeof(viz));
cin>>n>>m;
for (i=1;i<=m;++i) {
                   cin>>a>>b;
                   add(a,lda[b]);
                   add(b,lda[a]);
                   ++RG[a];
                   ++RG[b];
                   }

valid=1;
for (i=1;i<=n;++i) 
        if (RG[i]%2!=0){ cout<<"-1 \n";
                          valid=0;
                          break;
                        }
if (valid==1){
              dfs(1,viz,lda);
              for (i=1;i<=n;++i) 
                  if (viz[i]==0) { cout<<"-1 \n";
                                   valid=0;
                                   break;
                                  }
             }
if (valid==1) euler(1,lda);
                                    
return 0;
}