Pagini recente » Cod sursa (job #3221282) | Cod sursa (job #1539362) | Cod sursa (job #3162666) | Cod sursa (job #692808) | Cod sursa (job #1608413)
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
ifstream ka("ciclueuler.in");
ofstream ki("ciclueuler.out");
const int N_MAX = 100000;
const int M_MAX = 500000;
struct muchie
{
int index, id;
};
list <muchie> graf[N_MAX + 1];
int stiva[M_MAX + 1];
bool folosita[M_MAX + 1];
int grad[N_MAX + 1];
int n, m, a, b;
void cauta(int unde, int ce)
{
bool gasit = false;
for(list<muchie>::iterator it = graf[unde].begin(); it != graf[unde].end() && !gasit; ++it)
if(it->index == ce)
{
graf[unde].erase(it);
gasit = true;
}
}
int main()
{
ka >> n >> m;
for(int i = 1; i <= m; i++)
{
ka >> a >> b;
grad[a]++;
grad[b]++;
muchie mm;
mm.index = b;
mm.id = i;
graf[a].push_back(mm);
mm.index = a;
graf[b].push_back(mm);
}
bool eulerian = true;
for(int i = 1; i <= n && eulerian; i++)
if(grad[i] == 0 || grad[i] % 2 == 1)
eulerian = false;
if(!eulerian)
ki << -1;
else
{
stiva[++stiva[0]] = 1;
while(stiva[0])
{
int t = stiva[stiva[0]];
bool gasita = false;
for(list<muchie>::iterator it = graf[t].begin(); it != graf[t].end() && !gasita; ++it)
if(!folosita[it->id])
{
folosita[it->id] = true;
gasita = true;
stiva[++stiva[0]] = it->index;
cauta(it->index, t);
graf[t].erase(it);
}
if(!gasita)
{
if(stiva[0] != 1)
ki << t << " ";
stiva[0]--;
}
}
}
}