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(){}#endifEdge.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
- Kruskal算法求解最小生成树(c++实现)
- Kruskal算法求解最小生成树的Java实现
- Kruskal算法求解最小生成树
- 最小生成树kruskal算法并查集版 C语言实现
- 最小生成树kruskal算法并查集版 C语言实现
- 数据结构(C实现)------- 最小生成树之Kruskal算法
- Kruskal最小生成树算法代码实现(c++)
- C语言实现图的Kruskal最小生成树算法
- 最小生成树Kruskal算法朴素版 C语言实现
- 克鲁斯卡尔(Kruskal)算法求解最小生成树
- 求解最小生成树——kruskal算法模板
- python实现Kruskal算法求解加权图中最小生成树问题
- 最小生成树Kruskal算法C语言
- Java实现最小生成树Kruskal算法
- Kruskal算法实现最小生成树
- Matlab实现Kruskal最小生成树算法
- 最小生成树Kruskal算法的实现
- kruskal算法实现最小生成树
- 使用Camera Calibration Toolbox for Matlab进行摄像机标定
- JAVA相关基础知识
- 适配器模式的随想
- typecho插件TECopyright-更新到1.02
- Qt5官方Demo解析集5(总结)——Fortune例程的各个实现区别
- Kruskal算法求解最小生成树(c++实现)
- Linux删除空行的方法
- JAVA相关基础知识
- 用ssh反向连接内网主机
- Vim设置colorscheme小技巧
- 作为一个技术能力优秀的工程师,我们的能力如何发挥最大效果!
- Android 连续按下返回键完全退出应用
- android数据库升级(二)
- Spring对JTA的支持