Pagini recente » Cod sursa (job #3129065) | Cod sursa (job #382895) | Cod sursa (job #2984760) | Cod sursa (job #2161069) | Cod sursa (job #3202765)
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100003
#define MMAX 500003
using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
struct varf
{
int x,nr;
};
///x este vf adiacent iar nr numarul muchiei corespunzatoare
int n,m;
vector <varf> G[NMAX];
bool uz[MMAX]; ///uz[i] este 1 daca muchia cu nr de ordin i a fost utilizata pe ciclu
int d[NMAX]; ///gradele
int sol[NMAX],cont;
void citire()
{
int x,y;
fin>>n>>m;
for(int i=1; i<=m; i++)
{
fin>>x>>y;
varf vf;
vf.x=y;
vf.nr=i;
G[x].push_back(vf);
vf.x=x;
vf.nr=i;
G[y].push_back(vf);
d[x]++;
d[y]++;
}
}
int grade_pare()
{
//returneaza 0 daca nu toate gradele sunt pare
// altfel returneaza indicele unui vf care nu este izolat
int start;
for(int i=1; i<=n; i++)
{
if(d[i]%2) return 0;
if(d[i]) start=i;
}
return start;
}
void euler(int vf)
{
for(int i=0;i<G[vf].size();i++)
{
varf vfad=G[vf][i];
if(!uz[vfad.nr])
{
uz[vfad.nr]=1;
euler(vfad.x);
}
}
sol[++cont]=vf;
}
int main()
{
citire();
int start=grade_pare();
if(!start)
fout<<-1<<'\n';
else
{
euler(start);
bool eulerian=1;
for(int i=1; i<=m && eulerian; i++)
if(!uz[i]) eulerian=0;
if(!eulerian)
fout<<-1;
else
for(int i=1;i<=m;i++) fout<<sol[i]<<" ";
}
return 0;
}