Pagini recente » Cod sursa (job #2290642) | Cod sursa (job #717207) | Cod sursa (job #1374763) | Cod sursa (job #3194461) | Cod sursa (job #2832634)
// 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();
}