Pagini recente » Cod sursa (job #2394640) | Cod sursa (job #3270951) | Cod sursa (job #718470) | Cod sursa (job #2390525) | Cod sursa (job #3202728)
#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
stack <int> stiva;
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 start)
{
varf vfad;
stiva.push(start);
while(!stiva.empty())
{
int vf=stiva.top();
///aleg un varf adiacent cu vf
if(!G[vf].empty())
{
vfad=G[vf][G[vf].size()-1];
if(!uz[vfad.nr])
{
stiva.push(vfad.x);
uz[vfad.nr]=1;
}
G[vf].pop_back();
}
else {fout<<" "<<vf;stiva.pop();}
}
}
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.close();
fout.open("ciclueuler.out");
fout<<-1;
}
}
return 0;
}