Advertisement
Guest User

Untitled

a guest
Oct 30th, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. //Функция конвертации матрицы смежности в список инцидентности
  9. vector < pair < int, pair<int,int> > > ArrayConvToList(int **arr, int n)
  10. {
  11.     vector < pair < int, pair<int,int> > > res;// результирующий вектор
  12.    
  13.     for (int i = 0; i<n; i++)
  14.         for (int j = 0; j<n; j++)
  15.             if(arr[i][j]!=0)// если ребро существует
  16.                 res.push_back(make_pair < int, pair<int,int> >(arr[i][j],make_pair<int,int>(i,j)));
  17.  
  18.     return res;//вернем список
  19. }
  20.  
  21. // главна функция
  22. int main()
  23. {
  24.     //открываем файл для чтения
  25.     ifstream in ("in.txt");//матрица смежности
  26.  
  27.     int n;// размерность
  28.     in>>n;// читаем размер
  29.  
  30.     //выделяем память
  31.     int **g = new int *[n];//под строку
  32.     for (int i =0; i<n; i++)g[i] = new int [n];//под столбцы
  33.  
  34.     //читаем матрицу смежности
  35.     for (int i = 0; i<n; i++)
  36.         for (int j = 0; j<n; j++)
  37.             in>>g[i][j];
  38.  
  39.     //преобразуем матрицу смежности в список инцидентности G = (V,E)
  40.     vector < pair < int, pair<int,int> > > gl =  ArrayConvToList(g,n); // вес - вершина 1 - вершина 2
  41.  
  42.     //сортируем вектор
  43.     sort (gl.begin(), gl.end());
  44.    
  45.     // инвертируем , т.к. нам надо найти максимальный остов
  46.     reverse(gl.begin(), gl.end());
  47.  
  48.     //Принадлежность вершины тому или иному поддереву хранится в массиве
  49.     //belonging - в нём для каждой вершины хранится номер дерева, которому она принадлежит.
  50.     vector<int> belonging (n);
  51.  
  52.     //инициализация массива разными значениями
  53.     for (int i=0; i<n; ++i) belonging[i] = i;
  54.  
  55.     vector < pair<int,int> > tree ;// максимальный остов
  56.    
  57.     int tw = 0;//total weight - общий вес
  58.  
  59.     for (int i=0; i<gl.size(); ++i)// идем по списку ребер
  60.         if (belonging[gl[i].second.first] != belonging[gl[i].second.second])//если концы не пренадлежат разным деревьям
  61.         {
  62.             tw += gl[i].first;//увеличиваем общий вес дерева
  63.             tree.push_back (make_pair (gl[i].second.first, gl[i].second.second));//добавляем ребро в результат
  64.  
  65.             int left = belonging[gl[i].second.second],
  66.                 right = belonging[gl[i].second.first];
  67.            
  68.             // объедением два дерева
  69.             for (int j=0; j<n; ++j)
  70.                 if (belonging[j] == left)
  71.                     belonging[j] = right;
  72.         }
  73.  
  74.    
  75.     //выводим результат
  76.     reverse(tree.begin(), tree.end());
  77.     cout<<"Max tree:"<<endl;
  78.     for (int i=0; i<tree.size(); ++i)
  79.         cout<<tree.at(i).second+1<<" - "<<tree.at(i).first+1<<"\tW("<<g[tree.at(i).first][tree.at(i).second]<<")."<<endl;
  80.     cout<<"total weight:\t"<<tw<<endl;
  81.  
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement