Cod sursa(job #1916668)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 9 martie 2017 10:05:34
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <vector>
#include <stack>

#define NMax 100010

using namespace std;

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

int nodes, edges, deg[NMax], nCC;
bool mark[NMax];
vector<int> G[NMax], answ;
stack<int> mstack;

void DFS(int node)
{
    mark[node] = true;

     for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); it++)
        if (!mark[*it])
            DFS(*it);
}

bool has_euler_cycle()
{
    DFS(1);
    for (int i = 1; i <= nodes; i++)
        if (!mark[nodes] ||  deg[i] % 2 == 1)
            return false;

    return true;
}

void delete_edge(int n1, int n2)
{
    for (vector<int>::iterator it = G[n1].begin(); it != G[n1].end(); it++) {
         if (*it == n2) {
            G[n1].erase(it);
            break;
        }
    }

    for (vector<int>::iterator it = G[n2].begin(); it != G[n2].end(); it++) {
        if (*it == n1) {
            G[n2].erase(it);
            break;
        }
    }
}

void write_euler_cycle(int start)
{
    mstack.push(start);
    while (!mstack.empty()) {
        int crtNode = mstack.top();

        if (G[crtNode].empty()) {
            answ.push_back(crtNode);
            mstack.pop();
        }
        else {
            mstack.push(G[crtNode].front());
            delete_edge(crtNode, G[crtNode].front());
        }
    }

    answ.pop_back();
    for (vector<int>::iterator it = answ.begin(); it != answ.end(); it++)
        g << *it << ' ';
}

int main()
{
    f >> nodes >> edges;
    int n1, n2;
    for (int i = 1; i <= edges; i++) {
        f >> n1 >> n2;
        G[n1].push_back(n2); deg[n1]++;
        G[n2].push_back(n1); deg[n2]++;
    }

    if (has_euler_cycle())
        write_euler_cycle(1);
    else
        g << -1;

    return 0;
}