Pagini recente » Cod sursa (job #444825) | Cod sursa (job #667576) | Cod sursa (job #1580970) | Istoria paginii runda/simulare_fmi_nostress_4/clasament | Cod sursa (job #2364056)
#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[500005], k = 1, w[500005];
bool seen[500005];
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 = v[w[k]].size() - 1; i >= 0 && poz2.poz == 0; i --)
{
aux = v[w[k]][i];
if(seen[aux.poz] == false)poz2 = aux;
v[w[k]].pop_back();
}
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;
}