Cod sursa(job #2832634)

Utilizator enestianEne Sebastian enestian Data 14 ianuarie 2022 00:10:12
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
// Alg_tema4_ex1_CicluEuler.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
//https://infoarena.ro/problema/ciclueuler
//sursa inspiratie https://infoarena.ro/job_detail/2767668?action=view-source

#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

const int N = 100000, M = 500000;

int n, m;
int fromnode[M], tonode[M];
bool visited[M];
vector <int> vmuchii[N];
vector <int> vpath;
stack <int> stk;

bool conditieCiclu()
{
    for (int i = 1; i <= n; i++)
        if (vmuchii[i].size() % 2 == 1)
            return false;
    return true;
}

void citireMuchii()
{
    f >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        f >> x >> y;
        vmuchii[x].push_back(i);//vectorul muchiilor conectate la nod x
        vmuchii[y].push_back(i);//vectorul muchiilor conectate la nod y
        fromnode[i] = x;
        tonode[i] = y;
    }
}



void DFS_Euler(int nodstart)
{
    stk.push(nodstart);
    //cat timp stiva de noduri nu e goala, procesam
    while (stk.empty() == false)
    {
        int nod = stk.top();
        if (vmuchii[nod].empty() == false)
        {
            //se cauta o muchie ce pleaca din nod si nu a fost folosita anterior
            int muchie = vmuchii[nod].back();
            vmuchii[nod].pop_back();
            if (visited[muchie] == false)
            {// adaugare nod in stiva
			   visited[muchie] = true;
               if (tonode[muchie] == nod)
                    stk.push(fromnode[muchie]);
               else if (tonode[muchie] != nod)                
                    stk.push(tonode[muchie]); 
                                              
            }
        }
        else
        {//adaugam nodul la path solutie si il scoatem din stiva
            vpath.push_back(nod);
            stk.pop();
        }
    }
}

void afisare()
{
    for (int i = 0; i < vpath.size() - 1; i++)
        g << vpath[i] << " ";
    f.close();
    g.close();
}

int main()
{
    citireMuchii();
    if (conditieCiclu() == false)    
	{ 
		g << "-1"; 
		return 0;
	}		
    
	DFS_Euler(1);
    afisare();
	
}