Скачиваний:
20
Добавлен:
18.03.2018
Размер:
1.25 Кб
Скачать
//Минимальное остовное дерево

#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;   
}
Соседние файлы в папке Граф