Sunteți pe pagina 1din 8

2.

Dijkstra

Iepurasul de Paste trebuie sa transporte ouale colorate tuturor magazinelor din toata lumea.Sa se
calculeze costurile minime ale drumurilor de la un nod citit la toate celalte si sa se afiseze drumurile
pentru care s-au obtinut costurile minime.

#include<fstream>

#include<iostream>

#define maxi 1000000

using namespace std;

int mc[20][20],n,viz[20],dr[20],lung[20];

void citire()

{int i,j,x,y,c;

ifstream f("graf.in");

f>>n;

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

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

if (i!=j) mc[i][j]=maxi;

else mc[i][j]=0;

while (f>>x>>y>>c)

mc[x][y]=c;

f.close();

void drum(int i)

{ if (i)

{ drum(dr[i]);

cout<<i<<"

";

void Dijkstra()
{ int x,i,k; //initializare

cout<<"nodul de

plecare x=";cin>>x;

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

viz[i]=0;

lung[i]=mc[x][i];

if (lung[i]<maxi) dr[i]=x;

else dr[i]=-1;

viz[x]=1;

dr[x]=0;

lung, dr

for (int l=1;l<=n-1;l++)

int mini=maxi;

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

if (viz[i]==0 &&

lung[i]<mini)

{ mini=lung[i];

k=i; }

if (lung[k]<maxi)

{ viz[k]=1;

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

if (viz[j]==0 &&

lung[j]>lung[k]+mc[k][j])

{ lung[j]=lung[k]+mc[k][j];
dr[j]=k; }

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

if (i==x) cout<<"nu

exista drum de la "<<x<<" la "<<i<<endl;

else if (lung[i]==maxi)

cout<<"nu exista drum de la "<<x<<" la

"<<i<<endl;

else

cout<<"drumul minim de la "<<x<<" la

"<<i<<" este:";

drum(i);

cout<<" cu lungimea

"<<lung[i]<<endl;

int main()

{ citire();

Dijkstra();

3. Roy –Warshall

Alina s-a infectat cu noul virus SARS-CoV-2.Aceasta a intrat in contact cu n persoane, numerotate de la 1
la n, 1 fiind persoana cu care s-a intalnit cel mai recent.Acele persoane au intrat in contact cu alte m
persoane.Alina vrea sa isi dea seama de la cine a luat virusul.Determinati persoana de la care e posibil sa
se fi infectat.Daca sunt mai multe persoane suspecte se va alege cel cu care s-a intalnit mai recent.

Int n, m, a[20][20];

#include<fstream>

#include<iostream>
using namespace std;

int main()

{ifstream fin(“graf.in”)

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++)

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

cout<<a[i][j]<<” “;

cout<<endl;}

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

{x=0;

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

x=x+a[i][j];

cout<<” persoana cu care s-a vazut mai recent”<<i<<”este”<<x<<endl;

4.Orasul Timișoara are n intersectii unite prin m istrazi bidirecționale.Datorită gropilor de pe toate

străzile administratorul orașului dorește să repare cât mai multe străzi cu un cost minim, și să se poată
circula ușor între oricare două intesecții de pe străzi reparate.Acesta este obligat de colegi să repare
anumite străzi.Determinați costul minim pentru repararea străzilor, astfel încât să fie reparate străzile
dorite de colegi și să se poată circula ușor între oricare două străzi reparate.

Algoritm Kruskal

#include<fstream>

struct muchie

{ int x,y,c;

}u[50];

int a[20][20],n,m;

void citire()
{ int i;

ifstream f(“graf.in”);

f>>n;

m=1;

while (f>>u[m].x>u[m].y>>u[m].c)

m++;

f.close();

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

{ a[u[i].x][u[i].y]=u[i].c;

a[u[i].y][u[i].x]=u[i].c;

int conex()

int c[20],viz[20],i,p,u;

for (i=1;i&lt;=n;i++)

viz[i]=0;

p=u=1;

viz[1]=1;

c[u]=1;

while(p<=u)

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

if (a[c[p]][i]!=0 && !viz[i])

{ u++;

c[u]=i;

viz[i]=1;

p++;

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

if (viz[i]==0) return 0;

return 1;

void ordonare()

{ int i,j;

muchie aux;

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

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

if(u[i].c>u[j].c)

{ aux=u[i];

u[i]=u[j];

u[j]=aux;

void apm_kruskal()

{ int i,j,k,v,w,l[20],ct=0;

for (i=1;i&lt;=n;i++) l[i]=i;

cout<<”\nArborele Partial de cost Minim:”;

k=0;

i=1;

while (k<n-1)

{ if (l[u[i].x]!=l[u[i].y])

{ k++;

ct=ct+u[i].c;

cout<<”[“<<u[i].x<<”,”<<u[i].y<<”]“;

v=l[u[i].y];

w=l[u[i].x];

for (j=1;j<=n;j++)
if (l[j]==v) l[j]=w;

i++;

cout<<”costul arborelui partial minim= “<<ct;

int main()

{ citire();

if (conex()==0) cout<<”nu se poate construi arborele partial de cost minim”;

else

{ ordonare(); apm_kruskal();}

Algoritmul lui Prim

#include <fstream>

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

void citire()

{int x,y,z;

ifstream f("graf.in");

f>>n; //construiesc o matrice de costuri

while (f>>x>>y>>z)

a[x][y]=a[y][x]=z;

f.close();

void afisare()

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

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

cout<<a[i][j]<<" ";

cout<<endl;

}
}

void apm_prim()

{ int k,i,j,xp,v,w,min,ct=0;

cout<<"nod pornire: xp=";cin>>xp;

viz[xp]=1; //primul vf

for (k=1;k<=n-1;k++) //selecteaza vf (trebuie selectate toate varfurile)

{ min=1000; //pt fiecare vf calculam muchia minima cu un capat in vf i

for (i=1;i<=n;i++) //cautam muchiile cu un capat vizitat

for (j=1;j<=n;j++)//si unul nevizitat

if (viz[i]==1 && viz[j]==0 && a[i][j]!=0)

if (a[i][j]<min) //calculam muchia de cost minim

{ min=a[i][j];

v=i; w=j; //retin capetele muchiei

viz[w]=1; //marchez ca am vizitat w si retin costul in c

cout<<”[”<<v<<”,”<<w<<”] ”; //afisez muchia

ct=ct+a[v][w];

cout<<"costul arborelui partial minim ="<<ct;

int main()

{ citire();

afisare();

apm_prim();

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