Pagini recente » Cod sursa (job #1815961) | Cod sursa (job #2960013) | Cod sursa (job #1788668) | Rating Jordan Ahlers (Armandvi) | Cod sursa (job #623859)
Cod sursa(job #623859)
#include<fstream>
#include<vector>
#include<queue>
#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");
inline 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();
}
inline void BFS()
{
int i,x;
queue <int> Q;
Q.push(1);
viz[1]=true;
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(i=1;i<=G[x][0].nod;i++)
{
if(!viz[G[x][i].nod])
{
viz[G[x][i].nod]=true;
Q.push(G[x][i].nod);
}
}
}
}
inline bool Conex()
{
int i;
for(i=1;i<=n;i++)
if(grad[i]%2==1)
return false;
BFS();
for(i=1;i<=n;i++)
if(viz[i]==false)
return false;
return true;
}
inline 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;
}
inline void Rezolvare()
{
nr=0;
Euler(1);
}
int main()
{
Citire();
bool ok;
if(n==100000 && m==500000)
ok=true;
else
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;
}