Cod sursa(job #2326495)

Utilizator victorv88Veltan Victor victorv88 Data 23 ianuarie 2019 16:40:59
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <bitset>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

bitset<500005>viz;

int n, m, from, to, grad;

vector<int>graph[100005];
vector<pair<int,int> >muchii;
vector<int>rez;
stack<int>s;

//void verificare_conex(int ind)
//{
//    for (auto &v:graph[ind])
//    {
//        if (viz[v]==0)
//        {
//            viz[v]=1;
//            int nod1=muchii[v].first, nod2=muchii[v].second;
//            if (nod1!=ind)
//            {
//                verificare_conex(nod1);
//            }
//            else
//            {
//                verificare_conex(nod2);
//            }
//
//        }
//    }
//}
//
void gradee()
{
    for (int i=1; i<=n; i++)
    {
        grad=graph[i].size();
        if (grad%2==1)
        {
            g << -1;
            return;
        }
    }
}

void eulerian ()
{
    s.push(1);
    while (!s.empty())
    {
        int nod=s.top();
        bool vecini=false;
        if (graph[nod].size()==0)
            {
                rez.push_back(nod);
                s.pop();
            }
        else
        {
            int ultim=graph[nod].back();
            graph[nod].pop_back();
            if (viz[ultim]==0)
            {
                viz[ultim]=1;
                int nod1=muchii[ultim].first, nod2=muchii[ultim].second;
                if (nod1!=nod)
                {
                    s.push(nod1);
                }
                else
                {
                    s.push(nod2);
                }
            }
        }
    }
}

int main()
{
    f >> n >> m;
    for (int i=0; i<m; i++)
    {
        f >> from >> to;
        muchii.push_back({from,to});
        graph[from].push_back(i);
        graph[to].push_back(i);
    }
//    verificare_conex(1);
    gradee();
    eulerian();
    int l=rez.size();
    for (int i=0; i<l-1; i++)
    {
        g << rez[i] <<' ';
    }
    return 0;
}