C ++中使用STL的Kruskal最小生成树

在本教程中,我们将讨论一个程序,以使用C ++中的STL理解Kruskal的最小生成树

为此,我们将提供一个连接的,无向的和加权的图。我们的任务是为给定图计算最小生成树。

示例

#include<bits/stdc++.h>

using namespace std;

typedef pair<int, int> iPair;

//structure for graph

struct Graph{

   int V, E;

   vector< pair<int, iPair> > edges;

   Graph(int V, int E){

      this->V = V;

      this->E = E;

   }

   void addEdge(int u, int v, int w){

      edges.push_back({w, {u, v}});

   }

   int kruskalMST();

};

struct DisjointSets{

   int *parent, *rnk;

   int n;

   DisjointSets(int n){

      this->n = n;

      parent = new int[n+1];

      rnk = new int[n+1];

   for (int i = 0; i <= n; i++){

      rnk[i] = 0;

      parent[i] = i;

   }

}

int find(int u){

   if (u != parent[u])

   parent[u] = find(parent[u]);

   return parent[u];

}

void merge(int x, int y){

   x = find(x), y = find(y);

   if (rnk[x] > rnk[y])

      parent[y] = x;

   else

      parent[x] = y;

   if (rnk[x] == rnk[y])

      rnk[y]++;

   }

};

int Graph::kruskalMST(){

   int mst_wt = 0;

   sort(edges.begin(), edges.end());

   DisjointSets ds(V);

   vector< pair<int, iPair> >::iterator it;

   for (it=edges.begin(); it!=edges.end(); it++){

      int u = it->second.first;

      int v = it->second.second;

      int set_u = ds.find(u);

      int set_v = ds.find(v);

      if (set_u != set_v){

         cout << u << " - " << v << endl;

         mst_wt += it->first;

         ds.merge(set_u, set_v);

      }

   }

   return mst_wt;

}

int main(){

   int V = 9, E = 14;

   Graph g(V, E);

   g.addEdge(0, 1, 4);

   g.addEdge(0, 7, 8);

   g.addEdge(1, 2, 8);

   g.addEdge(1, 7, 11);

   g.addEdge(2, 3, 7);

   g.addEdge(2, 8, 2);

   g.addEdge(2, 5, 4);

   g.addEdge(3, 4, 9);

   g.addEdge(3, 5, 14);

   g.addEdge(4, 5, 10);

   g.addEdge(5, 6, 2);

   g.addEdge(6, 7, 1);

   g.addEdge(6, 8, 6);

   g.addEdge(7, 8, 7);

   cout << "Edges of MST are \n";

   int mst_wt = g.kruskalMST();

   cout << "\nWeight of MST is " << mst_wt;

   return 0;

}

输出结果

Edges of MST are

6 - 7

2 - 8

5 - 6

0 - 1

2 - 5

2 - 3

0 - 7

3 - 4

Weight of MST is 37

以上是 C ++中使用STL的Kruskal最小生成树 的全部内容, 来源链接: utcz.com/z/331559.html

回到顶部