Cod sursa(job #2171308)

Utilizator zanugMatyas Gergely zanug Data 15 martie 2018 11:53:25
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>

#define pb push_back

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

const int NLIM = 1e5+10;
const int MLIM = 5e5+10;

struct cucc
{
    int x, idx;
};

int n, m;
vector < cucc > graf[NLIM];
bool b[MLIM];

vector < int > er;
int nr;


bool eul()
{
    for(int i = 1; i <= n; ++i)
        if(graf[i].size() % 2 || graf[i].size() == 0)
            return false;
    return true;
}

bool dfs(int cnod)
{
    if(er.size() == m+1)
    {
        if(er.front() == er.back())
            return true;
        return false;
    }

    for(int i = 0; i < graf[cnod].size(); ++i)
    {
        if(!b[graf[cnod][i].idx])
        {
            b[graf[cnod][i].idx] = true;
            er.pb(graf[cnod][i].x);

            if(dfs(graf[cnod][i].x))
            {
                return true;
            }

            b[graf[cnod][i].idx] = false;
            er.pop_back();
        }
    }

}

int main()
{
    cin >> n >> m;

    cucc x, y;
    for(int i = 1; i <= m; ++i)
    {
        cin >> x.x >> y.x;
        x.idx = y.idx = i;

        graf[x.x].pb(y);
        graf[y.x].pb(x);
    }

    if(eul())
    {
        nr = 1;
        er.pb(1);
        bool wtf = dfs(1);

        for(int i = 0; i < m; ++i)
        {
            cout << er[i] << " ";
        }
    }
    else
    {
        cout << -1;
    }

    return 0;
}