Cod sursa(job #1615718)

Utilizator alexb97Alexandru Buhai alexb97 Data 26 februarie 2016 19:48:07
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <bitset>
#define MAXM 500010

using namespace std;

ifstream is("cicluleuler.in");
ofstream os("cicluleuler.out");

struct Edge{
    int x, y;
};


int n, m;
Edge muchii[MAXM];
vector<vector<int>> G;
vector<int> Cycle;
bitset <MAXM> 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(muchii[G[node].back()].x + muchii[G[node].back()].y - node);
    }
    Cycle.push_back(node);
}

int main()
{
    is >> n >> m;
    G = vector<vector<int>>(n+1);
    //viz = vector<bool>(MAXN);
    int x, y;
    for(int i = 1; i <= m; ++i)
    {
        is >> x >> y;
        G[x].push_back(i);
        G[y].push_back(i);
        muchii[i] = {x, y};
    }
    if(IsEulerian())
    {
        Dfs(1);
        for(int i = 0; i < int(Cycle.size() - 1); ++i)
        {
            os << Cycle[i] << ' ';
        }
        os << '\n';
    }
    else
        os << -1 << '\n';

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