Pagini recente » Cod sursa (job #2192140) | Cod sursa (job #2334425) | Cod sursa (job #153102) | Cod sursa (job #1140376) | Cod sursa (job #1608412)
#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;
muchie* next;
}*graf_inc[N_MAX + 1], *graf_sf[N_MAX + 1];
int stiva[M_MAX + 1];
bool folosita[M_MAX + 1];
int grad[N_MAX + 1];
int n, m, a, b;
int main()
{
ka >> n >> m;
for(int i = 1; i <= n; i++)
graf_inc[i] = NULL;
for(int i = 1; i <= m; i++)
{
ka >> a >> b;
grad[a]++;
grad[b]++;
muchie* mm = new(muchie);
mm->index = b;
mm->id = i;
if(graf_inc[a] == NULL)
{
graf_inc[a] = mm;
graf_sf[a] = mm;
}
else
{
graf_sf[a]->next = mm;
graf_sf[a] = graf_sf[a]->next;
}
if(a != b)
{
mm = new(muchie);
mm->index = a;
mm->id = i;
if(graf_inc[b] == NULL)
{
graf_inc[b] = mm;
graf_sf[b] = mm;
}
else
{
graf_sf[b]->next = mm;
graf_sf[b] = graf_sf[b]->next;
}
}
}
bool eulerian = true;
for(int i = 1; i <= n && eulerian; i++)
if(grad[i] == 0 || grad[i] % 2 == 1)
eulerian = false;
//for(muchie* it = graf_inc[2]; it != NULL; it = it->next)
//cout << it->index << " ";
if(!eulerian)
ki << -1;
else
{
stiva[++stiva[0]] = 1;
while(stiva[0])
{
int t = stiva[stiva[0]];
bool gasita = false;
for(muchie* it = graf_inc[t]; it != NULL && !gasita; it = it->next)
if(!folosita[it->id])
{
cout << t << " " << it->index << '\n';
folosita[it->id] = true;
gasita = true;
stiva[++stiva[0]] = it->index;
//if(it->next != NULL)
//it->next = it->next->next;
}
if(!gasita)
{
if(stiva[0] != 1)
{
ki << t << " ";
cout << "Da " << t << '\n';
}
stiva[0]--;
}
}
}
}