Cod sursa(job #1025495)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 10 noiembrie 2013 08:02:48
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
#define nmax 100000+5
#define mmax 400000+5
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
using namespace std;

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

struct muchie
{
    int dest;
    int indx;
};
bool mask[mmax];
int n, m;
int grad[nmax];
vector<muchie> u[nmax];
vector<int> s;

int grad_par()
{
    FOR(i, 1, n)
        if (grad[i] % 2 == 1)
            return 0;
    return 1;
}

int ciclu(int i, int muchii_ramase)
{
    if (muchii_ramase == 0)
        return 1;
    s.push_back(i);
    if (!u[i].empty())
        FOR(j, 0, u[i].size()-1)
            if (mask[u[i][j].indx])
            {
                mask[u[i][j].indx] = 0;
                int x = ciclu(u[i][j].dest, muchii_ramase-1);
                if (x)
                    return 1;
                mask[u[i][j].indx] = 1;
            }
    s.pop_back();
    return 0;
}
int main()
{
    int x, y;
    int indx = 0;
    muchie a, b;
    fin >> n >> m;
    FOR(i, 1, m)
    {
        fin >> x >> y;
        a.dest = y;
        a.indx = indx;
        u[x].push_back(a);
        b.dest = x;
        b.indx = indx;
        u[y].push_back(b);

        grad[x]++;
        grad[y]++;

        mask[indx] = 1;
        indx++;
    }
    if (grad_par() && ciclu(1, m))
        FOR(i, 0, m-1)
            fout << s[i] << ' ';
    else
        fout << "-1 ";
    fout << '\n';
    return 0;
}