Documente Academic
Documente Profesional
Documente Cultură
REPUBLICII MOLDOVA
FACULTATEA DE ECONOMIE, INGINERIE ȘI ȘTIINȚE APLICATE
DEPARTAMENTUL INGINERIE ȘI ȘTIINȚE APLICATE
PORTOFOLIU
LA DISCIPLINA: Algoritmica Grafurilor
Cahul 2020
Sarcina 1: Reprezentati grafic urmatoarele grafuri:
1) G=(x,u) neorientat cu x={1, 2, 3, 4, 5, 6}
U={(1, 2), (1, 3), (1, 4), (2,4), (3,4), (3,6), (4, 5)
1
3
5
2) G=(x,u) neorientat cu x={1, 2, 3, 4, 5}
U={(1, 2), (1,4), (2,3), (2.4), (3.5), (4.5)}
2 4
3
5
3)G=(x,u) orientat cu x={1, 2, 3, 4, 5} U={(1.3),(2.4),(3.1),(3.2),(3.4),(5.2),(5.5)}
1 3
2
4
5
4) G=(x,u) orientat cu x={1, 2, 3, 4, 5, 6} U={(1.2),(1.5),(1.6),(2.3),(2.4),(3.6),(4.3),(5.3),(6.4),(6.5)}
1 6
2 5
3
4
Sarcina 2: Determinați gradele vârfurilor grafurilor din sarcina 1
1)G=(x,u) neorientat cu x={1, 2, 3, 4, 5, 6}
U={(1, 2), (1, 3), (1, 4), (2,4), (3,4), (3,6), (4, 5)
1
6
2
3
4 5
x 1 2 3 4 5 6
D(x) 3 2 3 4 1 1
2
4
3
5
x 1 2 3 4 5
D(x) 2 3 2 3 2
1 3
2
4
5
X 1 2 3 4 5
D-(x) 1 1 1 2 2
D+(x) 1 2 2 0 1
D(x) 2 3 3 2 3
1 6
2 5
3
4
X 1 2 3 4 5 6
D-(x) 0 1 3 1 2 2
D+(x) 3 1 1 1 1 2
D(x) 3 2 4 2 3 4
2 5
7
1
6
3
4
X 1 2 3 4 5 6 7
D(x) 2 3 2 4 3 3 1
Numarul de muchii: 9
❑ 7
Suma numerelor∑ d (x)=∑ d ( x ) =2+ 3+2+4 +3+3+1=18
x∈ x x+1
2) Să se demonstreze că pentru graful orientat G=(X, U) cu X={1, 2, 3, 4, 5, 6} și
U={(1,2); (1,3); (2,5); (4,5); (5,1); (5,4)} suma gradelor interioare ale vârfurilor este
egală cu suma gradelor exterioare ale vârfurilor și este egală cu numărul de arce din
graf
2 5
1
3
6
4
X 1 2 3 4 5 6 Total
D-(x) 1 1 1 1 2 0 6
D+(x) 2 1 0 1 2 0 6
D(x) 3 2 1 2 4 0 12
Sarcina 4:
Ex. 1 Fie G=(X,U) un graf neorientat cu X={1, 2, 3, 4, 5, 6} și U={(1,2): (1,3); (1,5);
(2,5); (4,5)}
1 3
6
2
4 5
1. Într-un graf neorientat cu 10 noduri, numerotate de la 1 la 10, există câte o muchie între oricare
două noduri numerotate cu numere consecutive şi câte o muchie între nodul numerotat cu 10 şi
fiecare dintre celelalte noduri. Câte subgrafuri cu exact 3 noduri, toate adiacente două câte două,
are graful dat? Scrieţi pentru fiecare dintre aceste subgrafuri nodurile din care este format.
Raspuns: 8
(1,2,3);(2,3,4);(3,4,5);(4,5,6);(5,6,7);(6,7,8);(7,8,9);(8,9,10)
Raspuns: 4
3. Care este numărul maxim de noduri de grad 3 într-un graf neorientat cu 5 noduri? a. 4
b. 5 c. 3 d. 2
4. Care este numărul minim de muchii ce trebuie mutate în graful din figura
alăturată astfel încât acesta să fie conex şi fiecare nod să aparţină unui
ciclu?
a. 0 b. 1 c. 2 d. 3
6. Se consideră graful neorientat cu 6 noduri, definit cu ajutorul listelor de adiacenţă alăturate. Care
dintre mulţimile următoare de noduri are toate elementele extremităţi ale unor lanţuri elementare
de lungime 2 cu cealaltă extremitate în nodul 5?
1: 4,5,6
2: 5
3: 4
4: 1,3
5: 1,2,6
6: 1,5
a. {1,4,6} b. {2} c. {3} d. {2,6}
7. Graful neorientat cu 60 de noduri, numerotate de la 1 la 60, are numai muchiile: [1,60], [60,20],
[2,30] şi [4,30]. Numărul componentelor conexe ale grafului este egal cu: a. 3 b. 56
8. c. 54 d. 0
9. Se consideră un graf neorientat cu 7 noduri, numerotate de la 1 la 7 şi muchiile [1,5], [2,3], [2,4],
[2,5], [3,4], [4,5], [4,7], [5,6], [5,7].
a. Câte cicluri elementare distincte există în graf? Două cicluri sunt distincte dacă diferă prin
cel puţin o muchie. Raspuns: 4.
b. Care este lungimea maximă a unui ciclu elementar din acest graf? Raspuns: 5
c. Care este numărul minim de muchii care trebuie eliminate astfel încât graful parţial obţinut
să aibă 3 componente conexe? Raspuns: 2 ([1,5],[5,6])
Sarcina 7: Să se scrie programele ce soluționează următoarele probleme:
1.Într-o firmă sunt n angajați, numerotați de la 1 la n. Fiecare angajat având un singur șef direct, cu excepția
directorului, care nu are șef. Ierarhia firmei este dată printr-un vector de tip tată. Fiecare angajat al firmei
are un salariu dat printr-un număr natural.
Angajații și seful sunt recompensați astfel: câștigul fiecărui salariat este egal cu salariul său la care se adaugă
media aritmetică a câștigurilor subordonaților săi direcți. Media aritmetică se rotungește prin adaos la un
număr întreg (de exemplu 5.33 se rotungește la 6). Angajații care nu au subordonați direcți câștigă doar
salariul.
Calculați care este câștigul directorului firmei.
Programul :
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("firma.in");
ofstream fout("firma.out");
int fii(int r)
{
int k=0;
for(int i=1;i<=n;i++) if(t[i]==r) k++;
return k;
}
int calcul(int v)
{
s[v]=0;
for(int i=1;i<=n;i++)
if(t[i]==v)
s[v]=s[v]+calcul(i);
if(fii(v)>0) return x[v]+ceil((float)s[v]/fii(v));
else return x[v];
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>t[i];
if(t[i]==0) r=i;
}
for(int i=1;i<=n;i++) fin>>x[i];
fout<<calcul(r);
fin.close();
fout.close();
return 0;
}
Programul :
#include<fstream>
using namespace std;
const int inf=100000;
int c[200][200],dr[200],dj[200],d[200],p[200],n,m,x,y,t[200], tj[200], tr[200];
ifstream f("d.in");
ofstream g("d.out");
void citire()
{ int i,j,k,cost;
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) c[i][j]=0;
else c[i][j]=inf;
for(k=1;k<=m;k++)
{ f>>i>>j>>cost;
c[i][j]=cost;
}
f>>x>>y;
}
void dijkstra(int s)
{ int i,j,k,minn;
for(i=1;i<=n;i++)
{
d[i]=c[s][i];
if(i!=s && d[i]!=inf) t[i]=s;
else t[i]=0;
p[i]=0;
}
p[s]=1;
for(k=1;k<n;k++)
{ minn=inf;
for(i=1;i<=n;i++)
if(!p[i] && d[i]<minn)
{ minn=d[i]; j=i;
}
for(i=1;i<=n;i++)
if(!p[i] && d[i]>d[j]+c[j][i])
{ d[i]=d[j]+c[j][i];
t[i]=j;
}
p[j]=1;
}
}
int main()
{ int i,minn=100000,imin;
citire();
dijkstra(x);
for(i=1;i<=n;i++) { dj[i]=d[i]; tj[i]=t[i]; }
dijkstra(y);
for(i=1;i<=n;i++) { dr[i]=d[i]; tr[i]=t[i]; }
for(i=1;i<=n;i++)
if(dj[i]+dr[i]<minn)
{
minn=dj[i]+dr[i];
imin=i;
}
g<<"intersectia: "<<imin<<endl;
g<<"Julieta merge: "<<dj[imin]<<endl;
g<<"Romeo merge: "<<dr[imin]<<endl;
g<<"Traseul Julietei: ";
drum(imin,tj);
g<<"\nTraseul lui Romeo: ";
drum(imin,tr);
f.close();
g.close();
return 0;
date.in }
12 19 (n,m)
1 2 20 (intersectie 1, intersectie 2, date.out
lungime strada) Intersectia: 8
1 3 35 Julieta merge: 35
1 7 20 Romeo merge: 30
2 4 30 Traseul Julietei: 1 7 8
3 4 40 Traseul lui Romeo: 6 8
3 6 40
3 8 80
4 5 25
565
6 8 30
6 9 10
7 8 15
7 11 100
8 9 40
8 10 30
8 11 35
9 10 30
10 12 25
11 12 10
1 6 (Julieta, Romeo)
3.Într-o fabrică există n secții numerotate de la 1 la n și împărțite în 3 categorii:
-secții de intrare, adică secții prin care intră în fabrică materii prime
-secții intermediare, care primesc produse intermediare de la alte secții, le prelucrează și le transmit la
rândul lor altor secții
-secția numerotată cu n care este o secție de finalizare a producției
Pentru fiecare secție dintre cele n se cunosc următoarele informații:
- durata necesară pentru prelucrarea în secția respectivă
- numărul secțiilor și secțiile care furnizează produse intermediare secției curente
Știind că durata transportului produselor intermediare între secții este neglijabilă, că în fabrică nu se
formează circuite de producție și că o secție poate să-și înceapă activitatea doar după secția care furnizează
materiile de furnizat.
Calculați următoarele:
- timpul necesar pentru fabricarea produsului finit
- pentru fiecare secție timpul cel mai devreme ca să poată începe producția și timpul cel mai târziu în care
poate începe producția astfel încât durata totala a producției să nu fie afectată.
Oservații:
- secțiile fabriici pot lucra simultan
- secțiile de intrare pornesc cel mai devreme la momentul 0.
Indicații:
- duratele din vârfuri se mută pe arce
- se construiește matricea costurilor (duratelor)
- se aplică algoritmul Roy-Floyd pentru drum de cost maxim
- durata producției este maximul de pe ultima linie adunat cu durata de prelucrare din secția n
- cel mai repede o secție poate începe producția după ce au ajuns în ea produsele din secțiile de care
depinde, adică maximul de pe coloană
- cel mai târziu o secție poate începe producția astfel încât durata producțiilor de la ea la ultima secție să nu
fie mai mare decât durata de producție a celorlalte secții, și se obține prin diferența de pe ultima coloană
dintre maxim și fiecare element (durata corespunzatoare fiecărei secții).
Programul :
#include<fstream>
using namespace std;
ifstream f("date.in");
ofstream g("date.out");
int c[101],mm=0;
int n;
int minn=-1000000;
int a[102][102];
int main()
{
citire(a,n); date.out
afis(a,n); matricea costurilor maxime
rf(a,n);
0 3 4 # 12 12 # 12 # # # 19
# 0 1 # 9 9 # 9 # # # 16
afis(a,n); # # 0 # 8 8 # 8 # # # 15
g<<mm+c[n]<<endl; # # 3 0 11 11 3 11 # # # 18
####0######5
for(int i=1;i<=n;i++)
#####0#####3
{ # # # # # 6 0 6 # # # 13
long mmm=0; #######0###7
# # 1 # 9 9 1 9 0 # # 16
for(int j=1;j<=n;j++)
# 7 10 7 18 18 10 18 # 0 # 25
if(a[j][i]>mmm) mmm=a[j][i]; # # 12 9 20 20 12 20 9 # 0 27
g<<mmm<<" "; ###########0
33 (durata productiei)
if(mm>a[i][n]) g<<mm-a[i]
0 8 (cel mai devreme, cel mai tarziu)
[n]<<endl;
7 11
else g<<0<<endl; 12 12
} 99
20 22
f.close();
20 24
f.close(); 12 14
return 0; 20 20
9 11
}
02
00
27 27
date.in
12 (n)
3 1 8 3 5 3 6 7 1 7 9 6 (costurile)
0 (sectia 1 nu depinde de alta)
2 1 10 (sectia 2 depinde de 2 sectii, si
anume de 1 si 10)
3249
2 10 11
13
237
249
237
1 11
0
0
3568
4. Harta rutieră a unei țări este formată din n orașe și m șosele între 2 orașe, fiecare șosea fiind caractezizată
prin distanța în kilometri (număr natural).
Trei prieteni se găsesc în 3 orașe distincte x, y, z și își propun să se întâlnească într-un oraș t.
Calculați și afișați distanța minimă pe care o parcurge fiecare prieten din orașul de pornire până în orașul t
de destinație.
Afișați cele trei orașe de plecare în ordinea în care cei trei prieteni ajung în orașul t.
Programul :
#include<fstream>
using namespace std;
const int inf=100000;
int c[200][200],d[200],p[200],n,m,x,y,z,t;
ifstream f("d.in");
ofstream g("d.out");
void citire()
{ int i,j,k,cost;
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) c[i][j]=0;
else c[i][j]=inf;
for(k=1;k<=m;k++)
{ f>>i>>j>>cost;
c[i][j]=cost;
c[j][i]=cost;
}
f>>x>>y>>z>>t;
}
void dijkstra(int s)
{ int i,j,k,minn;
for(i=1;i<=n;i++)
{
d[i]=c[s][i];
p[i]=0;
}
p[s]=1;
for(k=1;k<n;k++)
{ minn=inf;
for(i=1;i<=n;i++)
if(!p[i] && d[i]<minn)
{ minn=d[i]; j=i;
}
for(i=1;i<=n;i++)
if(!p[i] && d[i]>d[j]+c[j][i])
d[i]=d[j]+c[j][i];
p[j]=1;
}
}
int main()
{ int dx,dy,dz;
citire();
dijkstra(x);
dx=d[t];
dijkstra(y);
dy=d[t];
dijkstra(z);
dz=d[t];
g<<"Distantele parcurse de cei trei prieteni:\n";
g<<dx<<" "<<dy<<" "<<dz<<endl;
g<<"Ordinea in care ajung cei trei prieteni:\n";
if(dx<=dy && dy<=dz) g<<x<<" "<<y<<" "<<z;
else if(dx<=dz && dz<=dy) g<<x<<" "<<z<<" "<<y;
else if(dy<=dx && dx<=dz) g<<y<<" "<<x<<" "<<z;
else if(dy<=dz && dz<=dx) g<<y<<" "<<z<<" "<<x;
else if(dz<=dx && dx<=dy) g<<z<<" "<<x<<" "<<y;
else if(dz<=dy && dy<=dx) g<<z<<" "<<y<<" "<<x;
f.close();
g.close();
return 0;
}
date.in date.out
12 19 (n,m) Distantele parcurse de cei trei
1 2 20 (oras 1, oras 2, distanta) prieteni:
1 3 35 80 70 105
1 7 20 Orasele de plecare in ordinea in care
2 4 30 ajung cei trei prieteni:
3 4 40 513
3 6 40
3 8 80
4 5 25
565
6 8 30
6 9 10
7 8 15
7 11 100
8 9 40
8 10 30
8 11 35
9 10 30
10 12 25
11 12 10
1 5 3 12 (x, y, z, t)
Sarcina 8:
1.Se dă un graf neorientat cu n vârfuri și m muchii. Să se scrie un program care va afișa grupurile de
muchii incidente.
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n,m,a[100][100];
void citire()
{
fin>>n>>m;
for(int i=0;i<=m;i++)
{
int x,y;
fin>>x>>y;
a[x][y]=a[y][x]=1;
}
}
int grad(int v)
{
int g=0;
for(int i=1;i<=n;i++)
g=g+a[v][i];
return g;
}
int main()
{
citire();
for(int i=1;i<=n;i++)
if(grad(i)>=2)
{
for(int j=1;j<=n;j++)
if(a[i][j]==1) fout<<"["<<i<<","<<j<<"] ";
fout<<endl;
}
fin.close();
fout.close();
return 0;
}
Exemplu
n=5 , m=4
muchiile:
[1,2]
[1,3]
[1,4]
[3,4]
grupurile de muchii incidente sunt
[1,2] [1,3] [1,4]
[1,3] [3,4]
[1,4] [3,4]
2. Se dă un graf neorientat cu n vârfuri și m muchii prin lista muchiilor Să se scrie un program care va
construi matricea lanțurilor folosind parcurgerea în adâncime.
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int A[50][50],L[50][50],n,m,k;
int p[50];
int main()
{
int x,y;
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
A[x][y]=A[y][x]=1;
}
for(int i=1;i<=n;i++)
{
p={0};
df(i,i);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) fout<<L[i][j]<<" ";
fout<<endl;
}
fin.close();
fout.close();
return 0;
}
Exemplu:
date.in
89
12
14
23
34
35
56
78
46
date.out
01111100
10111100
11011100
11101100
11110100
11111000
00000001
00000010
3.Se dă un graf orientat cu n vârfuri și m arce prin lista arcelor și un vârf k. Să se scrie un program care
va calcula câte vârfuri are componenta tare conexă în care se află vârful k.
#include<fstream>
using namespace std;
int k,l,m,n,a[100][100],pf[100],ps[100];
fstream f("date.in",ios::in);
fstream g("date.out",ios::out);
void citire()
{int x,y;
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>x>>y;
a[x][y]=1;
}
f>>k>>l;
}
int main()
{citire();
dfsuc(k);
dfpred(k);
for(int i=1;i<=n;i++)
if(pf[i]*ps[i]==0) pf[i]=ps[i]=0;
int t=0;
for(int i=1;i<=n;i++)
if(pf[i]) t++;
g<<t;
f.close();
g.close();
return 0;
}
Exemplu:
date.in
7 10 (n,m)
12
13
26
36
32
61
34
45
47
74
3 (k)
date.out
4
4.La un turneu de tenis participă n jucători cu numerele de ordine de la 1 la n. Fiecare dintre ei joacă cu
toți ceilalți câte o partidă. Fiecare dintre partide este dată ca o pereche de jucători (i, j) cu semnificația
că jucătorul i l-a învins pe jucătorul j. Scrieți un program care să afișeze primii 3 jucători în ordine
descrescătoare de victorii din turneu.
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
struct jucator {int j, p;};
int n;
jucator A[100];
void citire()
{
int i,j,p;
fin>>n;
for(p=1;p<=n*(n-1)/2;p++)
{
fin>>i>>j;
A[i].j=i;
A[i].p++;
}
}
int main()
{
citire();
ordonare(A,n);
for(int i=1;i<=3;i++)
fout<<A[i].j<<" "<<A[i].p<<endl;
fin.close();
fout.close();
return 0;
}
Exemplu:
date.in
5
1 2 *(cu semnificatia ca jucatorul 1 l-a invins pe jucatorul 2)
32
34
14
51
35
54
31
52
24
date.out
3 4 *(cu semnificatia ca jucatorul 3 are 4 victorii)
53
12