Добавил:
FluffyUnicorn
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Структуры данных примеры / Граф / kruskal
.cpp//Минимальное остовное дерево
#include <iostream>
#include <stdlib.h>
#define N 4
using namespace std;
main()
{
int G[N][N]={1000, 16, 12, 14,
16, 1000, 15, 13,
12, 15, 1000, 15,
14, 13, 15, 1000};
int p[N],rez[N-1][2];
int i, j, k=0, min_d, mi, mj, d=0;
for (i=0;i<N;i++)
p[i] = i;
do
{
min_d = 1000;
for (i=1; i<N; i++)
for (j=0; j<i; j++)
if (G[i][j]<min_d)
{
min_d = G[i][j];
mi = i;
mj = j;
}
if (p[mi]!=p[mj]) //ребро подходит
{
rez[k][0]=mi; rez[k][1]=mj; //запоминаем ребро
k++; //увеличиваем счетчик
d+=G[mi][mj]; //увеличиваем длину дерева
j=p[mi]; //запоминаем тип эл-тов первого множества
for (i=0;i<N;i++)
if (p[i]==j) p[i]=p[mj]; //объединяем множества, присваивая их эл-там одинаковый тип
}
G[mi][mj] = 1000; //чтобы ребро не повторялось
}
while (k<N-1);
cout<<d<<endl;
for (i=0;i<N-1;i++)
cout<<rez[i][0]<<"-"<<rez[i][1]<<endl;
system("pause");
return 0;
}