Sunteți pe pagina 1din 10

Grafuri hamiltoniene si euleriene

Definitii/Exemple/Teoreme:

Definitie: Se numeste ciclu hamiltonian într-un graf, un ciclu elementar


care contine toate vârfurile grafului.
Definitie: Se numeste graf hamiltonian, un graf care contine un ciclu
hamiltonian.

Figura 1.

Exemplu:
Graful din figura 1. este hamiltonian, deoarece ciclul c=[1,2,3,5,4,1] este
elementar (pleaca din vârful 1, iar muchiile [1,2], [2,3], [3,5], [5,4] si [4,1]
sunt distincte doua câte doua ) si în plus contine toate vârfurile.

Definitie: Se numeste lant hamiltonian într-un graf, un lant elementar


care contine toate vârfurile grafului.

Teorema:
Daca într-un graf G=(X,U) cu n> 3 vârfuri, gradul fiecarui vârf x verifica
conditia d(x)> n/2, atunci graful este hamiltonian.

Definitie: Se numeste ciclu eulerian într-un graf, un ciclu care contine


toate muchiile grafului.
Definitie: Se numeste graf eulerian, un graf care contine un ciclu
eulerian.
Figura 2.

Exemplu:
Pentru graful din figura 12. ciclul c=[1,2,3,6,7,8,3,4,5,1] este eulerian,
deoarece pleaca din vârful 1 si se termina tot în vârful 1, iar muchiile sale
consecutive, adica [1,2], [2,3], [3,6], [6,7], [7,8], [8,3], [3,4], [4,5], [5,1],
sunt distincte doua câte doua (altfel spus, ciclul nu trece de doua ori prin
aceeasi muchie).
Teorema:
Un graf fara vârfuri izolate este eulerian, daca si numai daca este conex, si
gradele tuturor vârfurilor sunt numere pare.

Scurta biografie Hamilton/Euler:

William Rowan Hamilton (1805 - 1865) a fost un


matematician irlandez și minune pentru copii. El a inventat
cuaternions, primul exemplu de „algebră non-comutativă”, care are
aplicații importante în matematică, fizică și informatică.
El a venit mai întâi cu ideea în timp ce se plimba pe Canalul Regal
din Dublin și a sculat formula fundamentală într-un pod de piatră pe care l-a trecut:
i2=j2=k2=ijk=−1.
De asemenea, Hamilton a adus contribuții semnificative la fizică, inclusiv optica și
mecanica newtoniană.
Leonhard Euler (1707 – 1783) a fost unul dintre cei mai mari
matematicieni din istorie. Munca sa acoperă toate ramurile
matematicii și el a scris 80 de volume de cercetare.
Euler s-a născut în Elveția și a studiat la Basel, dar a trăit marea
parte a vieții sale în Berlin, Prusia și în St. Petersburg, Rusia.
Euler a inventat o mare parte din terminologia și notațiile matematicii moderne și
a făcut descoperiri importante în analiză, teoria grafurilor, fizică, astronomie și în
multe alte subiecte.

Jocul Icosian:
Jocul icosian este un joc matematic inventat în 1857 de
William Rowan Hamilton. Obiectul jocului este găsirea unui ciclu
hamiltonian de-a lungul marginilor unui dodecaedru, astfel încât
fiecare vertex să fie vizitat o singură dată, iar punctul final să fie
același ca punctul de plecare.

Podurile din Konisberg:

Hartă a Königsbergului pe vremea lui Euler cu dispunerea efectivă


a celor șapte poduri, figurând și râul Pregel și podurile.
Problema celor șapte poduri din Konigsberg este o problemă de matematică de importanță istorică.
Leonhard Euler a arătat în 1736 că nu există soluție, punând bazele teoriei grafurilor și prefigurând ideea de
topologie.[1]

Orașul Konigsberg din Prusia (astăzi, Kaliningrad, Rusia) se întindea pe ambele mauri ale raului Pregel,
cuprinzând și două insule mari legate una de cealaltă, și cu diverse alte porțiune ale orașului prin șapte
poduri. Problema era de a elabora un drum prin oraș, care să traverseze fiecare dintre aceste poduri o dată și
numai o dată.

Pentru a enunța fără echivoc cerința logică a problemei, soluțiile care implică fie

1. ajungerea pe o insulă sau într-o parte de oraș altfel decât trecând podurile, sau
2. accesarea oricărui pod fără a-l traversa până la celălalt capăt

sunt în mod explicit inacceptabile.

Euler a demonstrat că problema nu are soluție. Dificultatea cu care s-a confruntat a fost să dezvolte de o
tehnică adecvată de analiză, și teste ulterioare, care să enunțe această afirmație cu rigoare matematică.

Link: Podurile din Konigsberg

Cod Sursa:
Verificare Graf Eulerian:

#include<fstream.h>

#include<iostream.h>

#include<conio.h>

struct nod{int info;

nod *next;};

int a[20][20],viz[20];

int g[20];

int n,m,k;

void df(int nod)

{viz[nod]=1;

for(int k=1;k<=n;k++)

if(a[nod][k]==1&&viz[k]==0)
df(k);

void citire()

{ int x,y;

fstream f; //memorare graf in matrice de adiacenta

f.open("euler.txt",ios::in);

if(f)

cout<<"ok";

else

cout<<"eroare";

cout<<endl;

f>>n>>m;

for(int i=1;i<=m;i++)

{f>>x>>y;

g[x]++; g[y]++;

a[x][y]=a[y][x]=1;

int verific()

{ for(int i=1;i<=n;i++)

if(g[i]%2==1)

return 0;

df(1);

for(i=1;i<=n;i++)

if(viz[i]==0)

return 0;

return 1;

}
void generezc1(nod*&p,nod*&u,int x)

{nod *q;

q=new nod;

q->info=x;

p=u=q;

do

{ int gas=0;

for(int i=1;i<=n&&!gas;i++)

if(a[i][u->info]==1)

{g[u->info]--;

g[i]--;

k++;

a[i][u->info]=a[u->info][i]=0;

q=new nod;

q->info=i;

u->next=q;

u=q;

gas=1;}

while(p->info!=u->info);

u->next=0;

void afisare(nod *q)

{while(q)

{cout<<q->info<<" ";

q=q->next;}

}
int cauta(nod *&q)

while(q)

{if(g[q->info])

return q->info;

q=q->next;

return 0;

void main()

{clrscr();

citire();

if(verific()==0)

cout<<"gf nu este eulerian!";

else

{ cout<<"este eulerian!";

nod *p=0,*u;

cout<<endl;

generezc1(p,u,1);

cout<<endl;

nod *p1=0,*u1;

while(k<m)

{nod *q=p;

int x=cauta(q);

generezc1(p1,u1,x);

u1->next=q->next;

q->next=p1->next;

afisare(p); }

getch();
}

Verificare graf Hamiltonian:

#include<fstream.h>
#include<conio.h>
#include<iostream.h>
int st[100],n,m,k,a[20][20];
int ns;
//k este este nivelul din stiva (indexul - vetorul solutie),curent
int e_valid()
{if(k>1)
if(!a[st[k-1]][st[k]])
return 0;
else
for(int i=1;i<=k-1;i++)//parcurg nivelurile anterioarenivelului curent
if(st[i]==st[k])
return 0;
if(k==n)
if(!a[st[1]][st[k]])
return 0;
return 1;
}
void afisare()
{for(int i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<st[1];
k=0; //determina iesirea la prima solutie
ns++;
}
void back()
{k=1; //pe primul nivel initial
while(k>0)//cand k va descreste la 0 algoritmul se incheie
if(st[k]<n)
{st[k]++;
if(e_valid())//daca elementul incarcat este valid
if(k==n)//verific daca am ajuns la solutia completa.
afisare();
else //daca nu am solutia completa urc in stiva (maresc vectorul, adica pe k)
{k++;
st[k]=0;}
}
else
k--;
}
void main()
{clrscr();
fstream f;
f.open("ham.in",ios::in);
int u,v;
if(f)
cout<<"ok!";
else
cout<<"eroare";
cout<<endl;
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>u>>v;
a[u][v]=a[v][u]=1;
}
cout<<"matricea de adiac "<<endl; // afisare matrice de adiacenta
for( i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
back();
if(ns==0)
cout<<”nu exista solutii”;
getch();
}

S-ar putea să vă placă și