Laborator 8
GRAFURI PONDERATE
Problema:
Algoritmul Krustal pentru determinarea arborelui partial de cost minim
Fisierul "graf.txt"
6 // reprezinta numarul de noduri
1 2 3 4 5 6 //acestea sunt nodurile
9 //reprezinta numarul de muchii existente in graf, inseamna ca avem 9 linii in continuare
1 2 1 // exista muchie intre 1 si 2, iar costul acesteia este 1
1 3 4 // exista muchie intre 1 si 3, iar costul acesteia este 4
1 4 10
2 5 3
2 6 2
3 5 1
4 5 20
4 6 30
5 6 1
Astfel, facem o matrice cu "numarMuchii" linii si 3 coloane.
Cod:
#include <iostream>
#include <fstream>
#define MAX 100
#define numarColoane 3
using namespace std;
int numarNoduri;
int numarLinii;
int matriceAdiacenta[MAX][MAX];
int vector[MAX];
void citire()
{
ifstream f("graf.txt");
int i,j;
f>>numarNoduri;
for(i=1;i<=numarNoduri;i++)
f>>vector[i];
f>>numarLinii;
for(i=1;i<=numarLinii;i++)
for(j=1;j<=numarColoane;j++)
f>>matriceAdiacenta[i][j];
f.close();
}
void sortare()
{
int i,j,s=0,aux;
do{ s=0;
for(i=1;i<=numarLinii-1;i++)
if(matriceAdiacenta[i][numarColoane]>matriceAdiacenta[i+1][numarColoane])
{
for(j=1;j<=numarColoane;j++)
{
aux=matriceAdiacenta[i][j];
matriceAdiacenta[i][j]=matriceAdiacenta[i+1][j];
matriceAdiacenta[i+1][j]=aux;
s=1;
}
}
}while(s!=0);
}
void afisareMatrice()
{
int i,j;
for(i=1;i<=numarLinii;i++)
{
for(j=1;j<=numarColoane;j++)
cout<<matriceAdiacenta[i][j]<<" ";
cout<<endl;
}
}
void kruskal()
{
int cost=0,numarLegaturi=0,liniaCurenta=1,aux,i;
cout<<"Legaturile:"<<endl;
while(numarLegaturi<numarNoduri-1)
{
int nodPlecare=matriceAdiacenta[liniaCurenta][1];
int nodDestinatie=matriceAdiacenta[liniaCurenta][2];
if(vector[nodPlecare]!=vector[nodDestinatie])
{
cost=cost+matriceAdiacenta[liniaCurenta][numarColoane];
numarLegaturi++;
cout<<"("<<nodPlecare<<","<<nodDestinatie<<")";
aux=vector[nodDestinatie];
for(i=1;i<=numarNoduri;i++)
if (vector[i]==aux)
vector[i]=vector[nodPlecare];
}
liniaCurenta++;
}
cout<<endl<<"Cost: "<<cost<<endl;
}
int main()
{
cout << "Hello world!" << endl;
citire();
afisareMatrice();
sortare();
cout<<endl;
afisareMatrice();
kruskal();
return 0;
}