Fiind dat un graf neorientat, să se determine dacă este eulerian, iar dacă răspunsul este afirmativ, să se determine toate ciclurile euleriene care încep dintr-un nod dat.
Pentru a rezolva această problemă, vom parcurge următorii paşi:
• se determină dacă graful este conex
• se determină dacă fiecare nod are grad par
#include "stdio.h"
#include "conio.h"
int a[10][10],viz[10],n,m;
//parcurgere in adâncime
void df_r(int nod)
{
int k;
//afişăm nodul curent ca vizitat
printf("%d ",nod);
//marcăm nodul curent ca vizitat
viz[nod]=1;
//pentru fiecare nod k
for(k=1;k <= n;k++)
//dacă există muchie între nodul curent şi nodul k şi nodul k nu a fost incă vizitat,
//apelăm funcţia recursivă de vizitare depth first df_r având ca parametru nodul k
if(a[nod][k] && !viz[k])
df_r(k);
}
void main()
{
int x,y,in,nr_n_viz=0,par=0,grad,i,j;
printf("Introdu nr de noduri:");
scanf("%d",&n);
printf("Introdu nr de muchii:");
scanf("%d",&m);
for(i=1;i <= n;i++)
for(j=1;j <= n;j++)
a[i][j]=0;
for(i=1;i <= m;i++)
{
printf("De la nodul:");
scanf("%d",&x);
printf("la nodul:");
scanf("%d",&y);
a[x][y]=a[y][x]=1;
}
printf("Introdu nodul de la care se porneşte:");
scanf("%d",&in);
df_r(in);
for(i=1;i <= n;i++)
nr_n_viz+=viz[i];
//verificăm dacă graful este conex contorizând numărul nodurilor vizitate
if(nr_n_viz!=n)
//dacă numărul nodurilor vizitate nu este egal cu numărul total de noduri
printf("Graful nu e conex! \n");
else
{
printf("Graful este conex!\n");
//determinăm dacă toate nodurile au gradele pare
for(i=1;i <= n;i++)
{
grad=0;
for(int j=1;j <= n;j++)
grad+=a[i][j];
if(grad%2 != 0)
par=1;
}
if(par)
printf("Exista noduri cu grade impare !\n");
else
printf("Avem un graf eulerian!\n");
}
getch();
}