Cod sursa(job #1380167)

Utilizator alexb97Alexandru Buhai alexb97 Data 6 martie 2015 22:33:04
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;

#define Nmax 100009
#define Mmax 500009
ifstream is("ciclueuler.in");
ofstream os("ciclueuler.out");

struct Edge{
    int x, y;
};

int n, m;
vector<vector<int>> G;
vector<int> Cycle;
Edge E[Mmax];
bitset <Mmax> viz;

int IsEulerian()
{
    for(int i = 1; i<= n; ++i)
        if(G[i].size() & 1) return 0;
    return 1;
}

inline void Dfs(int node)
{
    while(G[node].size())
    {
        if(viz[G[node].back()])
        {
            G[node].pop_back();
            continue;
        }
        viz[G[node].back()] = 1;
        Dfs(E[G[node].back()].x + E[G[node].back()].y - node);
    }
    Cycle.push_back(node);
}
int main()
{
    is >> n >> m;
    int x, y;
    G = vector<vector<int>>(n+1);
    for(int i = 1;i <= m; ++i)
    {
        is >> x >> y;
        G[x].push_back(i);
        G[y].push_back(i);
        E[i] = {x, y};
    }
    if(IsEulerian())
    {
        Dfs(1);
        for(int i = 0; i < Cycle.size() - 1; ++i)
        {
            os << Cycle[i] << ' ';
        }
        os << '\n';
    }
    else
        os << -1 << '\n';

    is.close();
    os.close();
    return 0;
}