Pagini recente » Cod sursa (job #141203) | Cod sursa (job #2760110) | Cod sursa (job #2786862) | Cod sursa (job #2447243) | Cod sursa (job #485292)
Cod sursa(job #485292)
#include <list>
#include <queue>
#include <cstdio>
#define MAXN 100010
#define pb push_back
#define p push
using namespace std;
list<int> v[MAXN];
queue<int> coada;
int g[MAXN],c[MAXN],c1[MAXN],n,m,q;
bool viz[MAXN];
FILE *fin =freopen("ciclueuler.in","r",stdin);
FILE *fout=freopen("ciclueuler.out","w",stdout);
void citeste(void)
{
int e1,e2,i;
fscanf(fin,"%d %d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d %d",&e1,&e2);
v[e1].pb(e2); g[e1]++;
v[e2].pb(e1); g[e2]++;
}
}
void dfs()
{
coada.push(1);
list<int>::iterator it;
while(!coada.empty())
{
for(it=v[coada.front()].begin();it!=v[coada.front()].end();it++)
if(!viz[*it])
{
viz[*it]=1;
coada.p(*it);
}
coada.pop();
}
}
bool este_eulerian()
{
int i;
dfs();
for(i=1;i<=n;i++)
if(g[i]%2!=0)
return 0;
for(i=1;i<=n;i++)
if(!viz[i])
return 0;
return 1;
}
void ciclu()
{
list<int>::iterator it;
int i,j,base=1,p;
c[1]=1;
do
{
base++;
c[base]=v[c[base-1]].front();
v[c[base-1]].pop_front();
for(it=v[c[base]].begin();it!=v[c[base]].end();it++)
if(*it==c[base-1])
{
v[c[base]].erase(it);
break;
}
}while(c[base]!=1);
p=1;
for(i=1;i<=base;i++)
if(!v[c[i]].empty())
{
q=i;
c1[p]=c[i];
break;
}
while(base-1<m)
{
do{
p++;
c1[p]=v[c1[p-1]].front();
v[c1[p-1]].pop_front();
for(it=v[c1[p]].begin();it!=v[c1[p]].end();it++)
if(*it==c1[p-1])
{
v[c1[p]].erase(it);
break;
}
}while(c[p]!=c[1]);
for(i=base;i>=q;i--)
c[i+p-1]=c[i];
for(j=2;j<=p;j++)
c[j+q-1]=c1[j];
base+=p-1;
}
}
int main()
{
citeste();
if(!este_eulerian())
fprintf(fout,"%d",-1);
else
{
ciclu();
for(int i=1;i<=m;i++)
fprintf(fout,"%d ",c[i]);
}
return 0;
}