Kruskal算法求解最小生成树(c++实现)

来源:互联网 发布:linux国内软件源 编辑:程序博客网 时间:2024/05/16 15:19

原问题的地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=38,该问题本质上是求最小生成树的问题,输入输出部分没有严格遵守题目的要求。

TreeSet.h

#ifndef TREESET_H#define TREESET_H#include<vector>#include"Edge.h"using std::vector;class TreeSet{public:TreeSet();~TreeSet();void AddNode(int n){nodes.push_back(n);}void AddEdge(Edge e){edges.push_back(e);}bool FindNode(int n){for (size_t i = 0; i < nodes.size(); ++i){if (nodes[i] == n)return true;}return false;}void Merge(TreeSet &t){for (size_t i = 0; i < t.nodes.size(); ++i){this->nodes.push_back(t.nodes[i]);}for (size_t i = 0; i < t.edges.size();++i){this->edges.push_back(t.edges[i]);}}private:vector<int> nodes;vector<Edge> edges;};TreeSet::TreeSet(){}TreeSet::~TreeSet(){}#endif
Edge.h

#ifndef EDGE_H#define EDGE_Hclass Edge{public:Edge(int v1, int v2, int c);~Edge();public:int m_v1;int m_v2;int c;};Edge::Edge(int v1, int v2, int c1){m_v1 = v1;m_v2 = v2;c = c1;}Edge::~Edge(){}#endif

main.cpp

#include<vector>#include<iostream>#include"Edge.h"#include"TreeSet.h"#include<assert.h>using std::vector;void SortEdge(vector<Edge> &G){Edge key(0,0,0);for (size_t j = 1; j < G.size(); ++j){key = G[j];int i = j - 1;while (i >= 0 && G[i].c>key.c){G[i + 1] =G[i];i = i - 1;}G[i + 1] = key;}}TreeSet MakeSet(int v){TreeSet t;t.AddNode(v);return t;}size_t FindSet(vector<TreeSet> &t,int v){size_t k = 0;for (; k < t.size(); ++k){if (t[k].FindNode(v))return k;}assert(k == t.size());}void Union(vector<TreeSet> &forest, size_t t1_index, size_t t2_index){forest[t1_index].Merge(forest[t2_index]);forest.erase(forest.begin()+t2_index);}int main(){std::cout << "input the number of vertex and edges\n";int num_vertex, num_edges;std::cin >> num_vertex >> num_edges;std::cout << "input the test data\n";int v1, v2, c;vector<Edge> G;while (std::cin>>v1>>v2>>c){Edge g_elenment(v1, v2, c);G.push_back(g_elenment);}vector<TreeSet> Sets;for (int i = 1; i <= num_vertex; ++i){Sets.push_back(MakeSet(i));}SortEdge(G);vector<Edge> Spantree;for (size_t i = 0; i < G.size(); ++i){size_t t1_index = FindSet(Sets, G[i].m_v1);size_t t2_index = FindSet(Sets, G[i].m_v2);if (t1_index!=t2_index){Spantree.push_back(G[i]);Union(Sets, t1_index, t2_index);}}int cost = 0;for (size_t i = 0; i < Spantree.size(); ++i)cost += Spantree[i].c;std::cout << cost;return 0;}



0 0
原创粉丝点击