Documente Academic
Documente Profesional
Documente Cultură
Definitii/Exemple/Teoreme:
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.
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.
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.
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.
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
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ă.
Cod Sursa:
Verificare Graf Eulerian:
#include<fstream.h>
#include<iostream.h>
#include<conio.h>
nod *next;};
int a[20][20],viz[20];
int g[20];
int n,m,k;
{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;
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;
{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)
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();
}
#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();
}