Pagini recente » Cod sursa (job #2951041) | Cod sursa (job #2456142) | Cod sursa (job #2349566) | Cod sursa (job #2415560) | Cod sursa (job #2363900)
#include <bits/stdc++.h>
using namespace std;
struct muchie
{
int val;
int poz;
}aux, poz2, aux1;
int poz1, n, m, i, j, grad[100005], a, b, lenght, ciclu[1000005], k = 1, w[1000005];
bool seen[100005];
vector <muchie> v[100005];
int main()
{
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
f >> n >> m;
for(i = 1; i <= m; i ++)
{
f >> a >> b;
aux.val = a;
aux.poz = i;
v[b].push_back(aux);
aux.val = b;
v[a].push_back(aux);
grad[a]++;
grad[b]++;
}
for(i = 1; i <= n; i ++)
if(grad[i] % 2 == 1)
{
g << "-1";
return 0;
}
lenght = 1;
ciclu[1] = 1;
while(true)
{
poz1 = 0;
for(i = 1; i <= lenght && poz1 == 0; i ++)
if(grad[ciclu[i]] > 0)poz1 = i;
if(poz1 == 0)break;
k = 1;
w[k] = ciclu[poz1];
do
{
poz2.poz = 0;
for(i = 0; i < v[w[k]].size() && poz2.poz == 0; i ++)
{
aux = v[w[k]][i];
if(seen[aux.poz] == 0)poz2 = aux;
}
aux1 = v[w[k]][i - 1];
while(true)
{
aux = v[w[k]][0];
if(aux.poz == aux1.poz)break;
v[w[k]].push_back(v[w[k]][0]);
v[w[k]].erase(v[w[k]].begin());
}
v[w[k]].erase(v[w[k]].begin());
seen[poz2.poz] = true;
grad[w[k]]--;
grad[poz2.val]--;
w[++k] = poz2.val;
}
while(w[k] != w[1]);
for(i = lenght; i > poz1; i --)
ciclu[i + k - 1] = ciclu[i];
for(i = poz1, j = 1; j <= k; i ++, j ++)
ciclu[i] = w[j];
lenght = lenght + k - 1;
}
for(i = 1; i < lenght; i ++)
g << ciclu[i] << " ";
return 0;
}