Pagini recente » Cod sursa (job #39700) | Cod sursa (job #1946662) | Cod sursa (job #2925886) | Cod sursa (job #575555) | Cod sursa (job #631859)
Cod sursa(job #631859)
#include<fstream>
#include<list>
#include<vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
long n,a,b,j=1,i,eul[500001],aux[500001],m,grad[100001];
list<int> v[100001];
list<int>::iterator it;
int merg(long x)
{ if (v[x].front() != 0)
{ ++j;
aux[j] = v[x].front();
v[x].pop_front();
it = v[aux[j]].begin();
while (it != v[aux[j]].end() && *it != x)
++it;
v[aux[j]].erase(it);
merg(aux[j]);
}
return 0;
}
int adaug()
{long ok=0,x;
while (ok != 1)
{ ok = 1;
i = 1;
while (v[i].front() == 0 && i < n)
++i;
if (i == n)
{ for (i=1;i<=m;++i)
fout << eul[i] << " ";
return 0;
}
else
{ m= j;
j = 1;
ok =0;
aux[1] = i;
merg(i);
i = 1;
while (eul[i] != aux[1] && i <= m)
++i;
for (x=1;x<j;++x)
{ eul[m+x+1] = eul[i+x];
eul[i+x] = aux[x+1];
}
m = m + j -1;
}
}
return 0;
}
int main()
{ fin >> n >> m;
for(i=1;i<=n;++i)
v[i].push_front(0);
for (i=1;i<=m;++i)
{ fin >> a >> b;
v[a].push_front(b);
v[b].push_front(a);
++grad[a];
++grad[b];
}
for (i=1;i<=n;++i)
if (grad[i]% 2 == 1)
{ fout << -1;
return 0;
}
aux[1] = 1;
merg(1);
m = j;
for (i=1;i<=m;++i)
eul[i] = aux[i];
adaug();
return 0;
}