Алгоритм Крускала минимальный выход связующего дерева

#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include<iomanip>
using namespace std;

typedef pair<int,int> intPair;
typedef vector<double> doubleVector; 
typedef vector<intPair> intPairVector; 

// Union-Find Disjoint Sets Library written in OOP manner, using both path compression and union by rank heuristics
class UnionFind {                                          
private:
        doubleVector p, rank, setSize;               
        int numSets;
public:
        UnionFind(int N) {
        setSize.assign(N, 1);
        numSets = N;
        rank.assign(N, 0);
        p.assign(N, 0);
        for (int i = 0; i < N; i++)
                p[i] = i;
        }
        int findSet(int i) {
                 return (p[i] == i) ? i : (p[i] = findSet(p[i]));
        }
        bool isSameSet(int i, int j) {
                return findSet(i) == findSet(j);
        }
        void unionSet(int i, int j) {
                if (!isSameSet(i, j)) {
                        numSets--;
                        int x = findSet(i), y = findSet(j);
 if (rank[x] > rank[y]) {
                                p[y] = x;
                                setSize[x] += setSize[y];
                        }
                        else{
                                p[x] = y;
                                setSize[y] += setSize[x];
                                if (rank[x] == rank[y])
                                        rank[y]++;
                        }
                }
        }
        int numDisjointSets() {
                return numSets;
        }
        int sizeOfSet(int i) {
                return setSize[findSet(i)];
        }
};

vector<intPairVector> AdjList;

int  main() {
        int num_verts=0;
        cin >> num_verts;


        //Pre-allocate a vector of num_verts rows, each of which is a vector
        //of num_verts copies of 0.0
        vector<vector<double> > matrix(num_verts, vector<double>(num_verts,0.0));

        for(int row = 0; row<num_verts;++row) {
                for(int col = 0; col<num_verts; ++col){
                        cin >> matrix[row][col];
                }
        }

        /*
        //print out the matrix we just read
        for(int row = 0; row<num_verts; ++row) {
for(int col=0; col<num_verts;++col){
                        cout << setprecision(2) << fixed <<  matrix[row][col] << "\t";
                }
                cout << "\n";
        }
        */


        vector< pair<double, intPair> > MST;

        //vector<intPairVector> MST;

        // Kruskal's algorithm merged
        AdjList.assign(num_verts, intPairVector());
        vector< pair<double, intPair> > EdgeList;   // (weight, two vertices) of the edge
        for (int row = 0; row<num_verts; ++row) {
                for(int col=0; col<num_verts;++col){
                        EdgeList.push_back(make_pair(matrix[row][col], intPair(row,col)));
                        AdjList[row].push_back(intPair(row,matrix[row][col]));
                        AdjList[col].push_back(intPair(col,matrix[row][col]));
                }
        }

        sort(EdgeList.begin(), EdgeList.end()); // sort by edge weight O(E log E)
                      // note: pair object has built-in comparison function

        MST = EdgeList;
        double  mst_cost = 0.0;
        UnionFind UF(num_verts);   // all V are disjoint sets initially
      **f**or (int i = 0; i < num_verts*num_verts; i++) {   // for each edge, O(E)
                pair<double,intPair> front = EdgeList[i];
                if (!UF.isSameSet(front.second.first, front.second.second)) {
                        // check
                        mst_cost += front.first; UF.unionSet(front.second.first, front.second.second);
                }
                else {
                        for(int j = 0; j<num_verts; j++) {
                        MST.erase(MST.begin()+j);
                        }
                        }
                                                              }
                        }
        }****

        //display the weight of the MST
        cout << setprecision(2) << fixed << mst_cost << "\n";

        //display the size of the matrix
        cout << matrix.size() << "\n";

        //display MST
        for(int row = 0; row<num_verts; ++row) {
                for(int col = 0; col<num_verts; ++col) {
                        cout << setprecision(2) << fixed << MST[row].first << "\t";
                }
                cout << "\n";

        }
  return 0;
}

Я пытаюсь реализовать MST для матрицы, мой код компилируется и выполняется. Тем не менее, я пытаюсь отслеживать MST, чтобы я мог отобразить его в конце. Всякий раз, когда я пытаюсь удалить элемент из матрицы, чтобы реализовать MST, я получаю неправильный ответ. Примером моего ввода является 4 0 2 2 6 2 0 5 1 2 5 0 1 6 1 1 0

Мой желаемый результат 4 4 0 2 0 0 2 0 0 1 0 0 0 1 0 1 1 0

Как я могу изменить этот код, чтобы сделать его правильным выводом? Заранее спасибо.

0 ответов

Другие вопросы по тегам