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.71 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. int **ptr;// костыль
  22.  
  23. // это наш функтор сортировки
  24. struct sort_class
  25. {
  26.     bool operator()( pair<int,int> a, pair<int,int> b)
  27.     {
  28.         if (ptr[a.first][a.second]>ptr[b.first][b.second]) return 1;
  29.  
  30.         if (
  31.             ptr[a.first][a.second]==ptr[b.first][b.second]
  32.             &&
  33.             a.second<b.second
  34.             ) return 1;
  35.        
  36.         if (
  37.             ptr[a.first][a.second]==ptr[b.first][b.second]
  38.             &&
  39.             a.second==b.second
  40.             &&
  41.             a.first<b.first
  42.             ) return 1;
  43.         return 0;
  44.     }
  45. } sort_object;
  46.  
  47. // главна функция
  48. int main()
  49. {
  50.     //открываем файл для чтения
  51.     ifstream in ("in.txt");//матрица смежности
  52.  
  53.     int n;// размерность
  54.     in>>n;// читаем размер
  55.  
  56.     //выделяем память
  57.     int **g = new int *[n];//под строку
  58.     for (int i =0; i<n; i++)g[i] = new int [n];//под столбцы
  59.  
  60.     //читаем матрицу смежности
  61.     for (int i = 0; i<n; i++)
  62.         for (int j = 0; j<n; j++)
  63.             in>>g[i][j];
  64.  
  65.     //преобразуем матрицу смежности в список инцидентности G = (V,E)
  66.     vector < pair < int, pair<int,int> > > gl =  ArrayConvToList(g,n); // вес - вершина 1 - вершина 2
  67.  
  68.     //сортируем вектор
  69.     sort (gl.begin(), gl.end());
  70.    
  71.     // инвертируем , т.к. нам надо найти максимальный остов
  72.     reverse(gl.begin(), gl.end());
  73.  
  74.     //Принадлежность вершины тому или иному поддереву хранится в массиве
  75.     //belonging - в нём для каждой вершины хранится номер дерева, которому она принадлежит.
  76.     vector<int> belonging (n);
  77.  
  78.     //инициализация массива разными значениями
  79.     for (int i=0; i<n; ++i) belonging[i] = i;
  80.  
  81.     vector < pair<int,int> > tree ;// максимальный остов
  82.    
  83.     int tw = 0;//total weight - общий вес
  84.  
  85.     for (int i=0; i<gl.size(); ++i)// идем по списку ребер
  86.         if (belonging[gl[i].second.first] != belonging[gl[i].second.second])//если концы не пренадлежат разным деревьям
  87.         {
  88.             tw += gl[i].first;//увеличиваем общий вес дерева
  89.             tree.push_back (make_pair (gl[i].second.first, gl[i].second.second));//добавляем ребро в результат
  90.  
  91.             int left = belonging[gl[i].second.second],
  92.                 right = belonging[gl[i].second.first];
  93.            
  94.             // объедением два дерева
  95.             for (int j=0; j<n; ++j)
  96.                 if (belonging[j] == left)
  97.                     belonging[j] = right;
  98.         }
  99.  
  100.    
  101.     //выводим результат
  102.     ptr=g;
  103.     sort(tree.begin(),tree.end(),sort_object);
  104.     for (int i=0; i<tree.size(); ++i) if(tree.at(i).first<tree.at(i).second)swap(tree.at(i).first,tree.at(i).second);
  105.     cout<<"Max tree:"<<endl;
  106.     for (int i=0; i<tree.size(); ++i)
  107.         cout<<tree.at(i).second+1<<" - "<<tree.at(i).first+1<<"\tW("<<g[tree.at(i).first][tree.at(i).second]<<")."<<endl;
  108.     cout<<"total weight:\t"<<tw<<endl;
  109.  
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement