Pagini recente » Cod sursa (job #1021171) | Cod sursa (job #2419836) | Cod sursa (job #1159464) | Cod sursa (job #1237826) | Cod sursa (job #600503)
Cod sursa(job #600503)
#include<stdio.h>
#include<malloc.h>
#define MaxN 100100
#define MaxM 300100
typedef struct _nod
{
int info;
int poz;
struct _nod *adr;
} nod;
typedef struct
{
struct _nod *cap;
} list;
list A[MaxN];
bool viz[MaxM];
int grad[MaxN];
int B[MaxM];
bool vizn[MaxN];
int N;
int M;
FILE *g = fopen("ciclueuler.out","w");
void add(int a,int b,int p)
{
nod *nou = (nod*)malloc(sizeof(nod));
nou->info = b;
nou->poz = p;
nou->adr = A[a].cap;
A[a].cap = nou;
}
void citire(void)
{
int a;
int b;
FILE *f = fopen("ciclueuler.in","r");
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d",&a,&b);
++ grad[a]; ++ grad[b];
add(a,b,i);
add(b,a,i);
}
fclose(f);
}
void add2(nod*& Cf,int a)
{
vizn[a] = true;
Cf->adr = (nod*)malloc(sizeof(nod));
Cf->adr->info = a;
Cf->adr->adr = NULL;
Cf = Cf->adr;
}
void BFS(int a)
{
vizn[a] = true;
nod *Ci = (nod*)malloc(sizeof(nod));
Ci->info = a;
Ci->adr = NULL;
nod *Cf = Ci;
while(Ci)
{
nod *q = A[Ci->info].cap;
while(q)
{
if(!vizn[q->info])
add2(Cf,q->info);
q = q->adr;
}
q = Ci;
Ci = Ci->adr;
free(q);
}
}
int verif(void)
{
int i = 1;
for(i=1;grad[i]%2 == 0 && i<=N;i++);
if(i <= N)
return 0;
BFS(1);
for(i=1;(vizn[i] || !A[i].cap) && i<=N;i++);
if(i <= N)
return 0;
return 1;
}
void euler(int v,int k)
{
nod *q = A[v].cap;
while(q)
{
if(!viz[q->poz])
{
viz[q->poz] = true;
euler(q->info,k+1);
}
q = q->adr;
}
if(k > 1)
fprintf(g,"%d ",v);
}
void solve(void)
{
if(!verif())
{
fprintf(g,"-1\n");
fclose(g);
return ;
}
euler(1,1);
fprintf(g,"\n");
fclose(g);
}
int main()
{
citire();
solve();
return 0;
}