Pagini recente » Cod sursa (job #1923501) | Cod sursa (job #2092725) | Cod sursa (job #1200268) | Cod sursa (job #1147512) | Cod sursa (job #769492)
Cod sursa(job #769492)
#include <iostream>
#include <list>
#include <stack>
#include <fstream>
#include <bitset>
#include <queue>
using namespace std;
list <int> v[100001], a;
int noduri, muchii, x, y, grade[100001], start;
bitset <100001> vizitat;
queue <int> coada;
stack <int> stiva;
inline void BF(int);
inline int Conex();
inline void Sterge(int, int);
inline void Euler(int);
int main(void)
{
int i;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
f >> noduri >> muchii;
for(int i = 0; i < muchii; i++)
{
f >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
grade[x]++;
grade[y]++;
}
f.close();
if(Conex() == 1)
{
start = 1;
do
{
Euler(start);
start = stiva.top();
stiva.pop();
a.push_front(start);
}
while(stiva.empty() == 0);
for(list<int>::iterator i = a.begin(); i != a.end(); i++)
g << *i << " ";
}
else
g << -1;
g.close();
return 0;
}
inline void BF(int nod)
{
int nodAuxiliar;
coada.push(nod);
vizitat[nod] = 1;
while(coada.empty() == false)
{
nodAuxiliar = coada.front();
for(list<int>::iterator i = v[nodAuxiliar].begin(); i != v[nodAuxiliar].end(); i++)
{
if(vizitat[*i] == 0)
{
vizitat[*i] = 1;
coada.push(*i);
}
}
coada.pop();
}
}
inline int Conex()
{
int i;
for(i = 1; i <= noduri; i++)
if(grade[i] & 1 == 1)
return 0;
BF(1);
for(i = 1; i <= noduri; i++)
if(vizitat[i] == 0)
return 0;
return 1;
}
inline void Sterge(int x, int y)
{
for(list<int>::iterator i = v[x].begin(); i != v[x].end(); i++)
{
if(*i == y)
{
v[x].erase(i);
return;
}
}
}
inline void Euler(int nod)
{
int x;
while(v[nod].empty() == 0)
{
x = v[nod].front();
stiva.push(nod);
v[nod].pop_front();
Sterge(x, nod);
nod = x;
}
}