Pagini recente » Cod sursa (job #2981272) | Cod sursa (job #2884550) | Cod sursa (job #2726242) | Cod sursa (job #1479905) | Cod sursa (job #1922852)
#include <fstream>
#include <vector>
#include <stack>
#include <set>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
/*
Deoarece trebuie sa stergem muchiile cat se poate de repede,
Nu vom memora la fel graful
G[x] .. va contine nr in ordinea citirii muchiilor
Begin[i] si End[i] vor fi a i-a muchie
Vectorul bool pt a marca daca a fost/sau nu folosita
*/
multiset <int> G[100005];
bool Viz[100005];
vector <int> Ans;
stack <int> Stk;
int N, M;
void DFS(int node)
{
Viz[node] = 1;
for (const int & x : G[node])
if (Viz[x] == 0)
DFS(x);
}
int main()
{
f >> N >> M;
for (int i = 0; i < M; ++i)
{
int x, y;
f >> x >> y;
G[x].insert(y);
G[y].insert(x);
}
//verificam grad par
for (int i = 1; i <= N; ++i)
if (G[i].size() % 2 == 1)
{
g << "-1";
return 0;
}
//verificam conexitate
DFS(1);
for (int i = 1; i <= N; ++i)
if (Viz[i] == 0)
{
g << "-1";
return 0;
}
//daca am ajuns aici, sigur putem construi un ciclu eulerian
Stk.push(1); //incepem cu nodul 1 ca nu conteaza intr-un ciclu
while (!Stk.empty())
{
int node = Stk.top();
if (!G[node].empty()) //daca mai avem muchii
{
int next = *G[node].begin(); //scoatem ultima muchie
G[node].erase(G[node].begin());
G[next].erase(G[next].find(node));
Stk.push(next); //introducem nodul in stiva
}
else //am terminat cu nodul respectiv, il eliminam si il introducem in raspuns
{
Stk.pop();
Ans.push_back(node);
}
}
for (int i = 0; i < Ans.size() - 1; ++i)
g << Ans[i] << " ";
f.close();
g.close();
return 0;
}