Pagini recente » Cod sursa (job #919210) | Cod sursa (job #471522) | Cod sursa (job #2161478) | Cod sursa (job #2734214) | Cod sursa (job #1281923)
#include <fstream>
#define NMAX 1000
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct Nod
{
int vf;
struct Nod *urm;
};
typedef Nod *Lista;
int n, m;
int G[NMAX][NMAX];
int d[NMAX];
bool uz[NMAX];
int nr;
Lista C1, C2;
void citire();
bool conex();
void DFS(int);
bool grade_pare();
int det_ciclu(int, Lista&);
void inserare(int, Lista&);
int caut_varf_adiacent(int);
int det_varf();
void unific();
void afisare();
int main()
{
int nr, nr2, z;
citire();
if(conex()&&grade_pare())
{
nr=det_ciclu(1, C1);
while(nr<m)
{
z=det_varf();//C1 va indica nodul care il preceda pe z
nr2=det_ciclu(z, C2);
unific();
nr+=nr2;
}
afisare();
return 0;
}
fout<<-1<<'\n';
return 0;
}
void citire()
{
int i, x, y;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
d[x]++; d[y]++;
G[x][y]++; G[y][x]++;//multigraf
}
}
bool conex()
{
int i;
DFS(1);
if(nr!=n)
return 0;
return 1;
}
void DFS(int vf)
{
uz[vf]=1; nr++;
int i;
for(i=1;i<=n;i++)
if(G[vf][i] && !uz[i])
DFS(i);
}
bool grade_pare()
{
int i;
for(i=1;i<=n;i++)
if(d[i]%2!=0)
return 0;
return 1;
}
int det_ciclu(int x, Lista& C)
{
int y, nr=0;
C=NULL;
inserare(x, C);
do
{
y=caut_varf_adiacent(C->vf);
if(y!=x) inserare(y, C);
nr++;
}
while(y!=x);
return nr;
}
void inserare(int x, Lista& C)
{
Lista p=new Nod;
p->vf=x;
if(!C)
{
p->urm=p;
C=p;
return;
}
p->urm=C->urm;
C->urm=p;
C=p;
}
int caut_varf_adiacent(int x)
{
int i;
for(i=1;i<=n;i++)
if(G[i][x])
{
G[i][x]--; G[x][i]--;
d[x]--; d[i]--;
return i;
}
return 0;//nu ajunge niciodata aici
}
int det_varf()
{
//parcurg ciclul C1 pana cand gasesc un varf z cu gradul nenul
Lista p=C1;
while(d[p->urm->vf]==0) p=p->urm;
C1=p;
return p->urm->vf;
}
void unific()
{
Lista p;
p=C1->urm;
C1->urm=C2->urm;
C2->urm=p;
}
void afisare()
{
Lista p=C1;
do
{
fout<<p->vf<<' ';
p=p->urm;
}
while(p!=C1);
fout<<C1->vf<<'\n';
}