Sunteți pe pagina 1din 7

I.P.

CENTRUL DE EXCELENŢĂ ÎN INFORMATICĂ ŞI TEHNOLOGII


INFORMAŢIONALE

LUCRARE INDIVIDUALĂ
Nr. 2(b)
LA DISCIPLINA :
“Utilizarea tehnicilor de programare”

Grupa: W-1732

Elevul:
Strişca Veaceslav

Profesor:
Troian Veaceslav
Chişinău 2019
Cuprins :

Nr Continut Pagina

1. Cuprins 2
2. Grafuri (Teorie) 3
3. Sarcina 5
4. Programul 6

5. Concluzie 11

6. Bibliografie 11

2
Grafuri
Un graf neorientat este o pereche ordonată de mulţimi G = ( V , E ).
Multimea V este o multime nevida si finita de elemente denumite varfurile
grafului.
Multimea E este o multime de perechi formate cu ajutorul varfurilor din graf.
In cazul grafurilor neorientate, perechile de varfuri din multimea E sunt
neordonate si se numesc muchii. Ele nu au directie. Muchia formata de varfurile x
si y se noteaza cu [x,y], varfurile x si y fiind denumite extremitatile muchiei.
Daca exista o muchie determinata de varfurile x si y atunci, varfurile x si y se
numesc adiacente. De asemenea, varfurile x si y sunt considerate incidente cu
muchia pe care o formeaza. Fiecare extremitate a unei muchii este considerata
incidenta cu muchia respectiva.
Intre varfurile oricarui graf neorientat poate exista cel mult o muchie.

1. Reprezentarea vizuala a grafurilor neorientate:


1. Pentru a usura reprezentarea acestora, pentru fiecare varf al grafului se
deseneaza un cerc si in interiorul cercului se trece numarul varfului.
2. Vom reprezenta fiecare muchie ca fiind o linie dreapta care pleaca de la un
varf si ajunge la celalalt.
Exemplu:

2.Gradul unui varf


Se numeste grad al unui varf x numarul de muchii incidente cu varful respectiv.
Graful unui varf x se noteaza cu d(x).

Astfel apar 2 notiuni noi:

Varful izolat = un varf care are gradul 0.


Varful terminal = un varf care are gradul 1.

3
x 1 2 3 4 5 6
d(x) 3 2 1 1 3 0

Observam din tabelul de mai sus faptul ca varful 6 este un varf izolat si ca varfurile
3 si 4 sunt varfuri terminale.
Teorema: Suma gradelor unui varf neorientat este egala cu dublul numarului de
muchii din graf.
Σd(x) = 2n
3. Notiunile de lant si ciclu
Intr-un graf neorientat, se numeste lant o secventa de varfuri cu proprietatea ca
oricare doua varfuri consecutive din secventa sunt adiacente. De exemplu, pentru
graful dat, [3,1,2,5,1,3,1] este un lant cu lungimea 6.

Lungimea unui lant = numarul de muchii pe care acesta le are in componenta.

Un lant este elementar atunci cand nu contine acelasi varf de mai multe ori. De
exemplu, pentru graful dat, [1,2,5] este un lant elementar cu lungimea 2.
Un lant este simplu daca nu contine de mai multe ori aceeasi muchie. De
exemplu, pentru graful dat, [3,1,2,5,4] este un lant simplu cu lungimea 4.

Se numeste ciclu, un lant simplu in care varful initial coincide cu varful final. In
alte cuvinte lantul pleaca din varful x si ajunge tot in varful x. De exemplu, pentru
graful dat, [1,2,5,1,2,5,1] este un ciclu.

Un ciclu este elementar daca nu contine de mai multe ori acelasi varf (cu exceptia
extremitatilor). De exemplu, pentru graful dat [5,1,2,5], este un ciclu elementar.

Teoreme:
- Un lant/ciclu elementar se numeste hamiltonian daca el trece prin toate
varfurile grafului.
- Un lant/ciclu elementar se numeste eulerian daca el trece prin fiecare
muchie al grafului o singura data.

4
Sarcina :

Se da un graf neorientat cu n noduri si m muchii precizat prin lista muchiilor.


Calculati distantele minime dintre oricare doua noduri ale grafului si afisati
distantele intr-o matrice A (nXn) in care fiecare element A[x][y] este egal cu
distanta minima de la varful x la varful y. Distanta minima dintre doua varfuri este
egala cu lungimea celui mai scurt lant care are cele doua noduri ca extremitati. Se
va folosi parcurgerea in latime.

Exemplu:
date.in
89
12
14
23
34
35
56
78
46
date.out
012132##
101223##
210112##
121021##
321201##
232110##
######01
######10
(# semnaleaza faptul ca nu exista lant intre doua varfuri)

5
Programul :
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

int A[100][100], D[100][100],n,m;

void citire()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
A[x][y]=A[y][x]=1;
}
}

void BF(int s)
{
int C[100]={0};
int d[100]={0};
int st,dr,i;
C[1]=s;
d[s]=1;
st=dr=1;
while(st<=dr)
{
for(i=1;i<=n;i++)
if(A[C[st]][i] && d[i]==0)
{
dr++;
C[dr]=i;
d[i]=d[C[st]]+1;
}
st++;
}
for(i=1;i<=dr;i++) D[s][C[i]]=d[C[i]]-1;
}

int main()
{
citire();
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) D[i][j]=-1;
for(i=1;i<=n;i++) BF(i);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(D[i][j]!=-1) fout<<D[i][j]<<" ";
else fout<<"# ";
fout<<endl;
}
fin.close();
fout.close();
return 0;
}

6
Concluzie:
In lucrarea individuală respectiva am descris unele din metodele de cautare, Grafurile.
Parcurgerea, structura, definitii, etc. Ulterior am elaborat un program ce ruleaza pe baza de
grafuri. Pentru crearea programului am avut nevoie de cunostinte de baza in programare,
precum cunostinta limbajului C++. Nu a fost o problema dificila, totusi a necesitat putina
atentie sit imp.

Bibliografie:
 https://invata.info/2017/03/31/teorie-grafuri-neorientate-c/#

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