最小生成树除了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 算法的实现相关推荐

  1. 【最小生成树】Prim算法和Kruskal算法的区别对比

    Prim算法和Kruskal算法都是从连通图中找出最小生成树的经典算法- 从策略上来说,Prim算法是直接查找,多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的- 所以说,Krus ...

  2. matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现

    Prim算法和Kruskal算法的Matlab实现 <计算机仿真>期末大作业 Prim算法和Kruskal算法的Matlab实现 05605刘禹050697(30) 连线问题应用举例: 欲 ...

  3. 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...

  4. 计算机图形学 区域填充,计算机图形学 区域填充算法的实现

    . '. 实验四区域填充算法的实现班级 08信计学号 58 姓名陈瑞雪分数 一.实验目的和要求: 1.掌握区域填充算法基本知识 2.理解区域的表示和类型,能正确区分四连通和八连通的区域 3.了解区域填 ...

  5. OpenCV中图像旋转(warpAffine)算法的实现过程

    在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...

  6. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  7. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  8. 干货回顾丨TensorFlow四种Cross Entropy算法的实现和应用

    交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方平方差(Mean Squared Er ...

  9. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

最新文章

  1. Windbg学习 (0x0002) 命令基础
  2. 【Spark篇】---Spark初始
  3. JAVA进制及进制之间的转换
  4. JQuery:JQuery添加元素
  5. Hive的基本操作-自定义函数
  6. MonogoDB 查询小结
  7. linux pwm控制蜂鸣器 滴滴_51单片机PWM直流电机PID控制转速源程序
  8. Ten years of pedestrian Detection-论文整理
  9. 给Fedora11安装五笔
  10. sql 整改措施 注入_记一次Sql注入 解决方案
  11. 国产环境小卫星数据预处理及简单应用
  12. 控制台输出Security Warning: The negotiated TLS 1.0 is an insecure protocol and is suported for backward c
  13. android获取root代码,Android获取ROOT权限的实例代码
  14. 照片审核处理工具_2020中级会计考试报名今天开始,照片上传要求相关说明
  15. python库itchat介绍(自动登录微信,自动回复消息)
  16. Android实例开发中按钮(Button)的四种点击方式的实现
  17. 19年1月底得一些装机心得(一)
  18. DSP TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制时的噪声抑制
  19. 你也遇到JSONException:create instance error, null...问题啦?
  20. MySQL-基本概念与查询操作(DESC/SELECT/FROM/WHERE/LIKE)

热门文章

  1. ROS用python编写订阅者和发布者(使用存放在其他package的自定义msg文件)
  2. 苏大强说:这才是最适合SOHO的客户开发方法
  3. 约瑟夫问题-输出最后的编号
  4. (一)改掉这些坏习惯,还怕写不出健壮的代码?
  5. 亿级流量电商详情页系统实战-1.小型电商网站的商品详情页的页面静态化架构以及其缺陷
  6. PostgreSQL 二进制安装
  7. 2021互联网大厂职级对应薪资一览表
  8. 碳云智能CEO王俊:大数据基础上人人都将活到120岁 | 2017 IT领袖峰会
  9. ERP系统常用SQL集锦(转, 一个网友写的,感觉有点虎头蛇尾,不过还是有价值参考)...
  10. require(‘inquirer‘)报错