Pagini recente » Cod sursa (job #2227417) | Cod sursa (job #1772503) | Cod sursa (job #572738) | Cod sursa (job #2203600) | Cod sursa (job #632766)
Cod sursa(job #632766)
#include <stdio.h>
#include <stack>
#include <queue>
#include <algorithm>
#define nMax 100100
#define max(a,b) ((a<b)?a:b)
using namespace std;
int n;
int m;
int grad[nMax];
int viz[nMax];
int coada[nMax];
int nCoada;
struct nod{
int x;
nod *urm;
}*a[nMax];
stack <int> s;
queue <int> afis;
void citire()
{
scanf("%d %d\n",&n,&m);
for(int i=0;i<m;i++)
{
int x;
int y;
scanf("%d %d\n",&x,&y);
grad[x]++;
grad[y]++;
nod *g;
g = new nod;
g -> x = x;
g -> urm = a[y];
a[y] = g;
nod *h;
h = new nod;
h -> x = y;
h -> urm = a[x];
a[x]=h;
}
}
void sterge(int x, int y)
{
if(a[x]->x == y)
{
a[x]=a[x]->urm;
return;
}
for(nod *i=a[x]; i->urm; i=i->urm)
{
if(i->urm->x==y)
{
i->urm=i->urm->urm;
return;
}
}
}
void euler(int v)
{
while(a[v])
{
int undeMerge=a[v]->x;
s.push(undeMerge);
a[v]=a[v]->urm;
sterge(undeMerge,v);
v=undeMerge;
}
}
void intelegemSolutiaLorSiIncercamSaOScriemSiNoi(int v) //functie denumita de PI
{
do{
euler(v);
v=s.top();
s.pop();
afis.push(v);
}while(!s.empty());
}
void bfs(int k)
{
coada[nCoada++]=k;
viz[k]=1;
for(int i=0;i<nCoada;i++)
{
for( nod *j=a[coada[i]];j;j=j->urm)
{
if(!viz[j->x])
{
viz[j->x]=viz[coada[i]]+1;
coada[nCoada++]=j->x;
}
}
}
for(int i=1;i<=n;i++)
if(viz[i]==0)
{
printf("-1\n");
exit(0);
}
}
void rez()
{
for(int i=0;i<=n;i++)
{
if(grad[i]!=0)
{
bfs(i);
intelegemSolutiaLorSiIncercamSaOScriemSiNoi(i);
return;
}
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
citire();
for(int i=0;i<=n;i++)
{
if(grad[i]==0)
viz[i]=1;
if(grad[i]%2==1)
{
printf("-1\n");
return 0;
}
}
rez();
while(!afis.empty())
{
printf("%d ",afis.front());
afis.pop();
}
printf("\n");
return 0;
}