Cod sursa(job #1880316)

Utilizator remus88Neatu Remus Mihai remus88 Data 15 februarie 2017 17:54:50
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <bitset>
#include <vector>
#define Nmax 100006
#define Mmax 500008

using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

typedef pair <int,int> edge;

int n,m,x,y;
bitset <Mmax> viz;
bitset <Nmax> used;
vector <int> cicle;
vector <int> G[Nmax];
//vector <edge> M;
edge M[Mmax];

void ReadInput()
{
    f>>n>>m;
    for (int i=1; i<=m; ++i)
    {
        f>>x>>y;
        M[i]=edge(x,y);
        G[x].push_back(i);
        G[y].push_back(i);
    }
}

void Dfs(int node)
{
    used[node]=1;
    for (auto i : G[node])
        if (!viz[i])
        {
            viz[i]=1;
            Dfs(M[i].first+M[i].second-node);
        }
    cicle.push_back(node);
}

bool AdmiteCiclu()
{
    for (int i=1; i<=n; ++i)
        if (G[i].size()%2==1) return 0;
    return 1;
}

void Solve()
{
    if (!AdmiteCiclu())
    {
        g<<-1<<'\n';
        return;
    }
    Dfs(1);
    for (int i=1; i<=n; ++i)
        if (!used[i])
        {
            g<<-1<<'\n';
            return;
        }
    for (auto x : cicle) g<<x<<' ';
    g<<'\n';
}

int main()
{
    ReadInput();
    Solve();
    f.close();
    g.close();
    return 0;
}