Prim 算法的实现
最小生成树除了prim还有kruskal算法。
Prim算法的实现,用到了优先队列。
仅供参考的c++代码:
#include <iostream>
#include <string>
#include <stack>
#include <fstream>
#include <sstream>
#include <ctime>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
/**********边表************/
class EdgeNode
{
public:int adjvex;int cost;int head;EdgeNode *next;EdgeNode(int _head, int _adj, int _cost,EdgeNode *n = NULL) : head(_head), adjvex(_adj), cost(_cost), next(n) {}
};
/*=========顶点表============*/
class VertexNode
{
public:int data;EdgeNode *firstEdge;VertexNode(){firstEdge = NULL;}
};
/*********自定义比较函数(优先队列使用)************/
class mycompare
{bool reverse;
public:mycompare(const bool &re = true){reverse = re; }bool operator() (EdgeNode *a, EdgeNode *b) const{//从小到大排列, 优先队列,!mycompare,按照cost的从小到大排列if(reverse) return (a->cost > b->cost); else {return (a->cost < b->cost);//从小到大排列, 优先队列,!mycompare,按照cost的从大到小排列}}};
/*********无向图的数据结构*************/
class Graph
{
public:
/*********初始化图的邻接表数据***************/Graph(){ifstream fin("pp.txt");string line;stringstream stream;if(getline(fin, line)){stream.clear();stream << line;stream >> numVertexes;stream >> numEdges;}init_adjList();while(getline(fin, line)){int vertex, adjacent, _cost;stream.clear();stream << line;stream >> vertex;stream >> adjacent;stream >> _cost;addEdge(vertex, adjacent, _cost); }}
/********初始化邻接表的顶点表*******/void init_adjList(){adjList.resize(numVertexes);for(int i = 0; i < numVertexes; i++){ adjList[i].data = i;} }/************加边,头插法*****************/void addEdge(int a, int b, int _cost){EdgeNode *enode1 = new EdgeNode(a-1, b-1, _cost, NULL);EdgeNode *enode2 = new EdgeNode(b-1, a-1, _cost, NULL);adjList[a-1].data = a-1;enode1->next = adjList[a-1].firstEdge;adjList[a-1].firstEdge = enode1;adjList[b-1].data = b-1;enode2->next = adjList[b-1].firstEdge;adjList[b-1].firstEdge = enode2;}
/************打印看结果************/void print(){ofstream fout;fout.open("primoutput.txt");for(int i = 0; i < numVertexes; i++){fout << "vertex:" << adjList[i].data << " adj:" ;EdgeNode *tmp = new EdgeNode(0, 0, 0 );tmp = adjList[i].firstEdge;while(tmp){fout << tmp->adjvex << "cost: " << tmp->cost << " ";tmp = tmp->next;}fout << endl;}}
/*********************************/
public:int numVertexes; //顶点数目int numEdges; //边数目vector<VertexNode> adjList; //图的邻接表
};
/***********prim算法实现**********/
class Prims
{
public:Prims(Graph graph){int s = 0;length = graph.numVertexes; //顶点数目tree.resize(length); marked.push_back(s); //将初始顶点加入最小生成树中pq.push(graph.adjList[s].firstEdge); //将初始顶点的第一条边加入队列while(!pq.empty()){EdgeNode *p = new EdgeNode(0,0,0);p = graph.adjList[s].firstEdge;while(p){if(!is_marked(p->adjvex)){pq.push(p);}p = p->next;}EdgeNode *p1 = new EdgeNode(0,0,0);p1 = pq.top();pq.pop();s = p1->adjvex;if(!is_marked(s)) //如果没有加入进最小生成树{marked.push_back(p1->adjvex);tree[p1->head].push_back(p1->adjvex); //将边加入最小生成数sum += p1->cost; //cost的累加}}}
/*******************判断是否加入最小生成树***************/ bool is_marked(int a){for(int i = 0; i < marked.size(); i++){if(marked[i] == a){return true;}}return false;}
/***************输出看结果**************/void write(){ofstream fout;fout.open("tree.txt");for(int i = 0; i < length; i++){fout << "tree[" << i << "]: " ;for(int j = 0; j < tree[i].size(); j++){fout << tree[i][j] << " ";}fout << endl;}}public:int length;int sum = 0;vector<int> marked;//最小生成树木的顶点表vector<vector<int> > tree; //最小生成树的边 ,数组存储priority_queue<EdgeNode*, vector<EdgeNode*>, mycompare> pq; //优先队列
};int main()
{Graph graph;graph.print();Prims _prims(graph);_prims.write();cout << "sum: " << _prims.sum << endl;return 0;
}
Prim 算法的实现相关推荐
- 【最小生成树】Prim算法和Kruskal算法的区别对比
Prim算法和Kruskal算法都是从连通图中找出最小生成树的经典算法- 从策略上来说,Prim算法是直接查找,多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的- 所以说,Krus ...
- matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现
Prim算法和Kruskal算法的Matlab实现 <计算机仿真>期末大作业 Prim算法和Kruskal算法的Matlab实现 05605刘禹050697(30) 连线问题应用举例: 欲 ...
- 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)
前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...
- 计算机图形学 区域填充,计算机图形学 区域填充算法的实现
. '. 实验四区域填充算法的实现班级 08信计学号 58 姓名陈瑞雪分数 一.实验目的和要求: 1.掌握区域填充算法基本知识 2.理解区域的表示和类型,能正确区分四连通和八连通的区域 3.了解区域填 ...
- OpenCV中图像旋转(warpAffine)算法的实现过程
在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...
- JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现
<实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...
- python边缘检测代码_python Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...
- 干货回顾丨TensorFlow四种Cross Entropy算法的实现和应用
交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方平方差(Mean Squared Er ...
- C++基础代码--20余种数据结构和算法的实现
C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...
最新文章
- Windbg学习 (0x0002) 命令基础
- 【Spark篇】---Spark初始
- JAVA进制及进制之间的转换
- JQuery:JQuery添加元素
- Hive的基本操作-自定义函数
- MonogoDB 查询小结
- linux pwm控制蜂鸣器 滴滴_51单片机PWM直流电机PID控制转速源程序
- Ten years of pedestrian Detection-论文整理
- 给Fedora11安装五笔
- sql 整改措施 注入_记一次Sql注入 解决方案
- 国产环境小卫星数据预处理及简单应用
- 控制台输出Security Warning: The negotiated TLS 1.0 is an insecure protocol and is suported for backward c
- android获取root代码,Android获取ROOT权限的实例代码
- 照片审核处理工具_2020中级会计考试报名今天开始,照片上传要求相关说明
- python库itchat介绍(自动登录微信,自动回复消息)
- Android实例开发中按钮(Button)的四种点击方式的实现
- 19年1月底得一些装机心得(一)
- DSP TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制时的噪声抑制
- 你也遇到JSONException:create instance error, null...问题啦?
- MySQL-基本概念与查询操作(DESC/SELECT/FROM/WHERE/LIKE)
热门文章
- ROS用python编写订阅者和发布者(使用存放在其他package的自定义msg文件)
- 苏大强说:这才是最适合SOHO的客户开发方法
- 约瑟夫问题-输出最后的编号
- (一)改掉这些坏习惯,还怕写不出健壮的代码?
- 亿级流量电商详情页系统实战-1.小型电商网站的商品详情页的页面静态化架构以及其缺陷
- PostgreSQL 二进制安装
- 2021互联网大厂职级对应薪资一览表
- 碳云智能CEO王俊:大数据基础上人人都将活到120岁 | 2017 IT领袖峰会
- ERP系统常用SQL集锦(转, 一个网友写的,感觉有点虎头蛇尾,不过还是有价值参考)...
- require(‘inquirer‘)报错