Sunteți pe pagina 1din 35

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII AL

REPUBLICII MOLDOVA
FACULTATEA DE ECONOMIE, INGINERIE ȘI ȘTIINȚE APLICATE
DEPARTAMENTUL INGINERIE ȘI ȘTIINȚE APLICATE

PORTOFOLIU
LA DISCIPLINA: Algoritmica Grafurilor

Elaborat: PASCAL Nicolae


Grupa: IT1901
Evaluat: POPOVICI Ilona
Asistent universitar

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

Concluzie: Avem 2 noduri terminale(5 si 6) si 4 noduri intermediare(1,2,3,4)


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

x 1 2 3 4 5

D(x) 2 3 2 3 2

Concluzie: Nu avem blocuri terminale


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

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

Concluzie: Nu avem blocuri initiale sau terminale.


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

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

Concluzie: Nu avem noduri terminale sau initiale.


Sarcina 3:
1)Să se demonstreze că în graful neorientat G=(X, U) cu X={1, 2, 3, 4, 5, 6, 7} și
U={(1,2); (1,3); (2,4); (2,5); (3,4); (4,5); (4,6); (5,6); (6,7)} suma gradelor vârfurilor
lui este egală cu dublul numărului de muchii din el.

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. Determinați lungimea lanțului L=[3, 1, 2, 5, 1, 3, 1, 5, 4]


2. Dați exemple de 2 lanțuri elementare și calculați lungimea lor

3. Dați exemple de 2 lanțuri simple

1 3

6
2

4 5

1) Lungimea lantului L=[3, 1, 2, 5, 1, 3, 1, 5, 4] este 5.


2) Lanturi elementare L=[3,1,5,4] cu lungimea 3
L=[4,5,2,1,3] cu lungimea 4
3) Lanturi simple L=[1,2,5] cu lungimea 2
L=[3,1,2,5,1] cu lungimea 4
Grafuri neorientate – Exerciții Pascal Nicolae, IT1901

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)

2. Pentru graful neorientat din figura alăturată, care este numărul de


muchii ale celui mai lung lanţ, format din noduri distincte, ce are ca
extremităţi nodurile 1 şi 3?

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

5. Se consideră graful neorientat cu 7 noduri, numerotate de la 1 la 7, şi


muchiile[1,3], [2,3], [3,4], [3,5], [5,4], [1,2], [2,5], [2,4], [6,7], [3,6]. Care dintre următoarele
succesiuni de noduri reprezintă un lanţ care trece o singură dată prin toate nodurile grafului?
a. (1, 2, 3, 4, 5, 6, 7) b. (4, 5, 3, 6, 7) c. (7, 6, 3, 5, 4, 2, 1) d. (1, 3, 5, 4, 2, 3, 6)

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 r,n, t[101],x[101], s[101];

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;
}

Datele de intrare: Datele de iesire :


firma.in firma.out
8 (numarul de angajati) 14
4 3 0 3 2 1 2 1 (vectorul tata)
2 6 4 3 7 3 1 5 (salariul fiecarui angajat)
2. Harta unui oraș este împărțită în n intersecții și m străzi cu sens unic între intersecții, fiecare stradă având
o lungime. Pentru două intersecții i și j poate exista atât strada de la i la j, cât și de la  j la i.
Într-o intersecție x se găsește Julieta și într-o intersecție y se găsește Romeo. Cei doi se pot deplasa pe străzi
în sensurile de parcurgere ale acestora.
Determinați intersecția în care trebuie să se întâlnească cei doi astfel încât să parcurgă în total o distanță
minimă.
Pentru soluția obținută afișați intersecția, distanța parcursă de Julieta, distanța parcursă de Romeo și traseul
parcurs de fiecate dintre ei.
Datele de intrare asigură că cei doi se pot întâlni.

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;
}
}

void drum(int i, int t[200])


{ if(t[i]) drum(t[i],t);
g<<i<<" ";
}

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];

void citire(int a[102][102],int &n)


{ int i,j,k,x;
f>>n;
for(i=1;i<=n+1;i++)
for(j=1;j<=n+1;j++)
if(i==j) a[i][j]=0;
else a[i][j]=minn;
for(i=1;i<=n;i++)
f>>c[i];
for(i=1;i<=n;i++)
{ f>>k;
for(j=1;j<=k;j++)
{ f>>x;
a[x][i]=c[x];
}
}
a[n][n+1]=c[n];
}

void afis(int a[102][102],int n)


{ int i,j;
g<<endl;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
if(a[i][j]==minn) g<<"# ";
else g<<a[i][j]<<" ";
g<<endl;
}
}

void rf(int a[102][102],int n)


{ int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]<a[i][k]+a[k][j] && a[i][k]!=minn && a[k][j]!=minn)
{ a[i][j]=a[i][k]+a[k][j];
if(a[i][j]>mm) mm=a[i][j];
}
}

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];

void df(int s,int k)


{
p[k]=1;
if(k!=s) L[s][k]=1;
for(int i=1;i<=n;i++)
if(!p[i] && A[k][i])
df(s,i);
}

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 dfsuc(int nod)


{int k;
pf[nod]=1;
for(k=1;k<=n;k++)
if(a[nod][k]==1 && pf[k]==0)
dfsuc(k);
}

void dfpred(int nod)


{int k;
ps[nod]=1;
for(k=1;k<=n;k++)
if(a[k][nod]==1 && ps[k]==0)
dfpred(k);
}

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++;
}
}

void ordonare(jucator A[100], int n)


{
int i,j;
jucator aux;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(A[i].p<A[j].p)
{
aux=A[i]; A[i]=A[j]; A[j]=aux;
}
}

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

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