Pagini recente » Cod sursa (job #1905093) | Cod sursa (job #2115129) | Cod sursa (job #265744) | Cod sursa (job #2641350) | Cod sursa (job #623814)
Cod sursa(job #623814)
#include<fstream>
#include<vector>
#include<iostream>
#include<cstdlib>
using namespace std;
int n,m,grad[100010],sol[500500],nr;
struct Muchie{int nod,poz;bool ok;};
Muchie *G[100010];
bool viz[100010];
ofstream fout("ciclueuler.out");
void Citire()
{
Muchie aux;
aux.ok=true;
int i,x,y;
ifstream fin("ciclueuler.in");
fin>>n>>m;
for(i=1;i<=n;i++)
{
G[i]=(Muchie *)realloc(G[i],sizeof(Muchie));
G[i][0].nod=0;
}
for(i=1;i<=m;i++)
{
fin>>x>>y;
if(x!=y)
{
G[y][0].nod++;
G[x][0].nod++;
}
else
G[x][0].nod++;
G[y]=(Muchie *)realloc(G[y],(G[y][0].nod+1)*sizeof(Muchie));
aux.nod=x;
aux.poz=G[x][0].nod;
G[y][G[y][0].nod]=aux;
if(x!=y)
{
G[x]=(Muchie *)realloc(G[x],(G[x][0].nod+1)*sizeof(Muchie));
aux.nod=y;
aux.poz=G[y][0].nod;
G[x][G[x][0].nod]=aux;
}
grad[x]++;
grad[y]++;
}
fin.close();
}
void DFS(int x)
{
int i;
for(i=1;i<=G[x][0].nod;i++)
{
if(!viz[G[x][i].nod])
{
viz[G[x][i].nod]=true;
DFS(G[x][i].nod);
}
}
}
bool Conex()
{
int i;
for(i=1;i<=n;i++)
if(grad[i]%2==1)
return false;
viz[1]=true;
DFS(1);
for(i=1;i<=n;i++)
if(viz[i]==false)
return false;
return true;
}
void Euler(int x)
{
int i;
for(i=1;i<=G[x][0].nod;i++)
{
if(G[x][i].ok==true)
{
G[x][i].ok=false;
if(G[x][i].nod!=x)
G[G[x][i].nod][G[x][i].poz].ok=false;
Euler(G[x][i].nod);
}
}
sol[++nr]=x;
}
void Rezolvare()
{
nr=0;
Euler(1);
}
int main()
{
Citire();
bool ok=Conex();
if(!ok)
{
fout<<-1<<"\n";
fout.close();
return 0;
}
else
{
int i;
Rezolvare();
for(i=1;i<=nr;i++)
fout<<sol[i]<<' ';
fout<<"\n";
fout.close();
}
return 0;
}