Pagini recente » Cod sursa (job #203248) | Cod sursa (job #116080) | Cod sursa (job #1040160) | Cod sursa (job #3343121) | Cod sursa (job #3336140)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
// pozitia ramasa a fiecarui nod
vector<int> pos;
vector<int> x, y; // nodurile incidente fiecarui muchii
vector<vector<int>> vecini; // vecini
vector<bool> vizMuchie;
vector<int> ciclu;
bool graduriPare()
{
for (vector<int> &v : vecini)
if (v.size() % 2 == 1)
return false;
return true;
}
void dfsEuler(int nod)
{
while (pos[nod] < vecini[nod].size())
{
int currentMuchie = vecini[nod][pos[nod]];
pos[nod]++;
if (!vizMuchie[currentMuchie])
{
vizMuchie[currentMuchie] = true;
dfsEuler(x[currentMuchie] + y[currentMuchie] - nod);
}
}
ciclu.push_back(nod);
}
int main()
{
int n, m;
in >> n >> m;
pos = vector<int>(n, 0);
vizMuchie = vector<bool> (m, false);
vecini = vector<vector<int>> (n);
for (int i = 0; i < m; i++)
{
int a, b; in >> a >> b;
a--; b--;
x.push_back(a);
y.push_back(b);
vecini[a].push_back(i);
vecini[b].push_back(i);
}
if (graduriPare())
{
dfsEuler(0);
for (int i = 0; i < ciclu.size() - 1; i++)
out << ciclu[i] + 1 << " ";
}
else
out << -1;
return 0;
}