Cod sursa(job #1199796)
Utilizator | Data | 20 iunie 2014 17:07:50 | |
---|---|---|---|
Problema | Ciclu Eulerian | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.5 kb |
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
typedef struct celula {
int nod;
celula* next;
}*lista;
void add(int nod, lista &p)
{
lista r=new celula;
r->nod=nod;
r->next=p;
p=r;
}
void dfs(int nod,int 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(int nod,lista lda[])
{
lista r,v;
long key;
if (lda[nod]!=0){
cout<<nod<<" ";
key=lda[nod]->nod;
v=lda[nod];
lda[nod]=lda[nod]->next;
delete v;
v=lda[key];
r=v;
if (lda[key]->nod==nod) {
v=lda[key];
lda[key]=lda[key]->next;
delete v;
}
else
while (v) {
if (v->nod==nod){
r->next=v->next;
delete v;
break;
}
r=v;
v=v->next;
}
euler(key,lda);
}
}
int n,i,j,valid,m,a,b;
int viz[100001],RG[10001];
lista lda[10001];
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;
}