Pagini recente » Cod sursa (job #494822) | Cod sursa (job #206013) | Cod sursa (job #1094878) | Cod sursa (job #323103) | Cod sursa (job #264133)
Cod sursa(job #264133)
#include<stdio.h>
#define infile "ciclueuler.in"
#define outfile "ciclueuler.out"
#define nmax 100*1001
#define mmax 1000*1001
struct stiva
{
int x; //nodul parcurgerii
int ul; //pozitia ultimului fiu rezolvat
} s[mmax]; //stiva in care vom face parcurgerea
struct lista
{
int n; //nodul
int pa,pu; //pozitia anterioara si pozitia urmatoare
int pl; //pozitia din lista a arcului opus
char v; //pt vizita
} l[mmax]; //lista
struct nod
{
int p,g; //pozitia ultimului fiu din lista, si gradul sau
} n[nmax]; //nodurile
int nr,mr; //numarul de noduri/muchii
//adaugam muchie intre x si y, la pozitiile m, si m+1
void add(int m, int x , int y)
{
l[m].n=y; l[m].pa=n[x].p; l[l[m].pa].pu=m; n[x].p=m; l[m].pl=++m; //adaugam arcul (x,y)
l[m].n=x; l[m].pa=n[y].p; l[l[m].pa].pu=m; n[y].p=m; l[m].pl=m-1; //adaugam arcul (y,x)
n[x].g++; n[y].g++; //crestem gradele
}
//sterge arcul retinut la pozitia m in lista
void del(int m, int x)
{
if(l[m].pa&&l[m].pu) //inseamna k avem un arc care are legatura si in stanga si in dreapta
{
l[l[m].pa].pu=l[m].pu;
l[l[m].pu].pa=l[m].pa;
}
else if(!l[m].pa) //inseamna k avem un arc care este ultimul
l[l[m].pu].pa=0;
else //inseamna k arcul este primul
n[x].p=l[m].pu;
}
//DFS - nerecursiv
void dfs(int x)
{
int p=1; //capatul superior al stivei
s[p].x=x; s[p].ul=n[x].p; //initializam stiva
while(p) //cat timp avem elemente in stilva
{
for( ;s[p].ul;s[p].ul=l[s[p].ul].pa) //parcurgem copii ramasi neparcursi
if(!l[s[p].ul].v) //daca muchia nu a mai fost parcursa
{
l[l[s[p].ul].pl].v=l[s[p].ul].v=1; //marcam muchia ca vizitata (pe ambele sensuri)
del(s[p].ul,s[p].x); del(l[s[p].ul].pl,l[s[p].ul].n); //stergem din lista cele doua muchii
p++; s[p].x=l[s[p-1].ul].n; s[p].ul=n[s[p].x].p; //adaugam nodul in stiva
break; //oprim pentru moment nodul curent
}
if(!s[p].ul) { if(p>1) printf("%d ",s[p].x); p--; } //inseamna k trebuie sa revenim o pozitie din stiva, deci afisem nodul
}
}
void citire()
{
int i,x,y;
scanf("%d %d\n",&nr,&mr);
for(i=1;i<=mr;i++)
{
scanf("%d %d\n",&x,&y); //citim muchia
add(2*i-1,x,y); //adaugam muchia dintre x si y
}
}
void verificare()
{
int i;
for(i=1;i<=nr;i++)
if(n[i].g%2) //are grad impar
break; //oprim
if(i<=nr) printf("-1"); //inseamna ca nu poate forma un ciclu eulerian
else dfs(1); //inseamna k se poate forma, deci facem parcurgerea dfs
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
citire();
verificare();
fclose(stdin);
fclose(stdout);
return 0;
}