Pagini recente » Cod sursa (job #2002554) | Cod sursa (job #599519) | Cod sursa (job #2152327) | Cod sursa (job #409907) | Cod sursa (job #481612)
Cod sursa(job #481612)
#include<fstream>
#include<list>
#define NMAX 100003
#define MMAX 500005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
list<int> a[NMAX];
int n, m, ne, nc, i;
int E[MMAX], c[MMAX], viz[NMAX], grad[NMAX];
list<int>::iterator it;
void citeste()
{
f>>n>>m;
int i, x, y;
for (i=1; i<=m; ++i)
{
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
++grad[x];++grad[y];
}
}
void DFS(int nod)
{
list<int>:: iterator it;
viz[nod]=1;
for(it=a[nod].begin(); it!=a[nod].end(); ++it)
if (!viz[*it]) DFS(*it);
}
void sterge(int y, int x)
{
for(it=a[y].begin(); it!=a[y].end(); ++it)
if (*it==x)
{
a[y].erase(it);
break;
}
}
void ciclu()
{
int x, y;
do
{
x=c[nc];
y=*a[c[nc]].begin();
a[x].pop_front();
sterge(y,x);
++nc;c[nc]=y;
--grad[x];--grad[y];
}while(c[1]!=c[nc]);
}
void move(int pos)
{
int j;
for (j=ne;j>=pos;j--) E[j+nc-1]=E[j];
for (j=1;j<=nc-1;j++) E[j+pos]=c[j+1];
ne+=nc-1;
}
void solve_ciclu()
{
int i, x, y;
ne=1;E[ne]=1;
do
{
x=E[ne];
y=*a[E[ne]].begin();
a[x].pop_front();
sterge(y,x);
++ne;E[ne]=y;
--grad[y];--grad[x];
}while(E[ne]!=1);
while (ne-1<m)
{
for (i=1; i<ne; ++i)
if (grad[E[i]]>0) break;
c[1]=E[i];nc=1;
ciclu();
move(i);
}
}
void solve()
{
int i, ok=1;
for(i=1; i<=n; ++i)
if (viz[i]!=1 || grad[i]%2==1)
{
ok=0;
break;
}
if (ok) solve_ciclu();
else g<<"-1\n";
}
int main()
{
citeste();
DFS(1);
solve();
g<<E[1];
for (i=2; i<ne; ++i) g<<" "<<E[i];
g<<"\n";
f.close();
g.close();
return 0;
}