Cod sursa(job #2363900)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 3 martie 2019 18:45:33
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#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;
}