【问题标题】:How to display minimum spannign tree matrix如何显示最小生成树矩阵
【发布时间】:2018-04-13 23:13:20
【问题描述】:
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include<iomanip>
using namespace std;

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

// Union-Find Disjoint Sets Library written in OOP manner, using both path compression and union by rank heuristics
class UnionFind {                                              // OOP style
private:
        doubleVector p, rank, setSize;                       // remember: vi is vector<double>
        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);
// rank is used to keep the tree short
                        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));

        //Requires c++11 or higher
        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";
        }
        // 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

        double  mst_cost = 0.0;
        UnionFind UF(num_verts);         // all V are disjoint sets initially

        for (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;                // add the weight of e to MST
                        UF.unionSet(front.second.first, front.second.second);    // link them
                }
        }                       // note: the runtime cost of UFDS is very light

        //display the weight of the MST
        cout << setprecision(2) << fixed << mst_cost << endl;
  return 0;
}

我试图从这段代码中显示最小生成树,我不知道如何让这段代码显示修改后的矩阵。代码工作正常,我的意思是它正在编译和计算图表的正确权重。但是,我不确定如何使用 Kruskals 算法显示最小生成树。感谢您的帮助

【问题讨论】:

    标签: c++ minimum-spanning-tree kruskals-algorithm


    【解决方案1】:

    每当您将边的权重添加到 MST 的权重时,您还应该将该边添加到列表中以跟踪 MST 边。

    【讨论】:

    • 我无法创建一个跟踪边缘的列表,这个列表应该是 vector 类型还是我应该使用哪种类型的列表?
    • vector的类型应该是边的类型,比如intPair
    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多