Pagini recente » Cod sursa (job #1240314) | Cod sursa (job #971091) | Cod sursa (job #958046) | Cod sursa (job #880869) | Cod sursa (job #2079002)
#define DM 100001
#define DN 500001
#include <bitset>
#include <fstream>
#include <vector>
using namespace std;
ifstream fi ("ciclueuler.in");
ofstream fo ("ciclueuler.out");
bitset <DN> bs;//muchii folosite
int n, m, nod, dest, sens1[DN], sens2[DN];//sens - capetele muchiilor
vector <int> v[DM], stk, rasp;//v - muchiile fiecarui nod; stk - stack simulat; rasp - ciclu final
int main()
{
//citire
fi >> n >> m;
for (int i = 1; i <= m; ++i)
{
fi >> sens1[i] >> sens2[i];
v[sens1[i]].push_back(i);
v[sens2[i]].push_back(i);
}
//verificare existenta ciclu eulerian
for (int i = 1; i <= n; ++i)
if (v[i].size()&1)
{
fo << -1;
return 0;
}
//alcatuire ciclu eulerian
stk.push_back(1);
while (!stk.empty())
{
nod = stk.back();
//scot muchiile folosite
while (v[nod].size() && bs[v[nod].back()])
v[nod].pop_back();
//bag inca un nod in graf
if (v[nod].size())
{
//verific sensul muchiei
if (nod == sens1[v[nod].back()])
stk.push_back(sens2[v[nod].back()]);
else
stk.push_back(sens1[v[nod].back()]);
//marchez muchia ca folosita
bs[v[nod].back()] = 1;
//sterg muchia din lista nodului;
v[nod].pop_back();
}
//scot nodul din graf si il bag in ciclu
else
{
stk.pop_back();
rasp.push_back(nod);
}
}
//afisez raspunsul
rasp.pop_back();//ultimul nod din rasp este chiar nodul din care am pornit
for (int i = 0; i < rasp.size(); ++i)
fo << rasp[i] << ' ';
return 0;
}