edge* Graph::prim(int cur) {
if (cur >= this->vertexNum) {
return NULL;
}
int *weight = new int[this->vertexNum];
this->minPath = new edge[this->vertexNum - ];//存储最小生成树的边
int *neighbor = new int[this->vertexNum];//记录与i点距离最近的顶点的编号,应该是找到该节点的前驱节点标记
bool* U = new bool[this->vertexNum];//已加入最小生成树的节点,规定节点在该数组中为true;不在为fasle
bool* flag = new bool[this->vertexNum];//作为prim算法的完善,如果记录的前后边值反向(即记录到错误的边),则将此对应的flag置为false
//数组的索引为顶点值,记录的为该索引到其临近的线索边的反向情况。
for (int i = ; i < this->vertexNum; i++){
U[i] = false;
flag[i]= true;
}
U[cur] = true;
for (int i = ; i < this->vertexNum; i++) {
weight[i] = this->matrix[cur][i]>matrix[i][cur]?matrix[i][cur]:matrix[cur][i];//记录第一个节点与其他节点的权值
if (weight[i] == matrix[i][cur] && matrix[cur][i] != matrix[i][cur]) {
flag[i] = false;
}
neighbor[i] = cur;
}
int index;//记录最小权值边所连接的顶点
neighbor[cur] = -;//
for (int i = ; i < this->vertexNum; i++) {//i表示寻找边的次数,有n个节点,则寻找n-1次,i不参与任何邻接矩阵的寻值
int min = INFINIT;
for (int j = ; j < this->vertexNum; j++) {
if (min > weight[j] && U[j] == false) {
index = j;
min = weight[j];
}
}
U[index] = true;
if (neighbor[index] >= ) {
if (flag[index]==true) {
minPath[i - ].setValue(neighbor[index], index, min);
/*temp[i].setStartVertex(neighbor[index]);
temp[i].setEndVertex(index);
temp[i].setWeight(min);*/
//不知道为什么始无法通过上述句子给temp[i]赋值,先注释掉
cout << neighbor[index] << ' ' << index << ' ' << min << endl;
}
else{
minPath[i - ].setValue(index, neighbor[index], min);
cout << index << ' ' << neighbor[index] << ' ' << min << endl;
}
}
for (int j = ; j < this->vertexNum; j++) {
if (weight[j] > this->matrix[index][j]|| weight[j] > this->matrix[j][index] && U[j] == false) {
neighbor[j] = index;
weight[j] = this->matrix[index][j] > this->matrix[j][index] ? this->matrix[j][index]: this->matrix[index][j];
if (weight[j] == this->matrix[j][index] && matrix[j][index] != matrix[index][j]) {
flag[j] = false;
}
}
}
}
return this->minPath;
}
/*prim:
neighbor记录的是寻找到每个节点的前驱节点。如果在第二个for循环里没有找到以第二个为线索的后继节点,则下一个找到的节点必然以第一个
节点为线索。(初始顶点已知,第一个for循环以初始顶点为线索找到第二个顶点,第二个for循环则以第二个顶点为线索,寻找是否有符合条件的第三个
顶点,如果有,将第三个顶点的前驱(线索)记录到neighbor中,同时跟新权重(weight)值,使得下一次寻找时能够找到第三个顶点。
关于weight,并不是属于初始顶点到各个顶点的权重值,但它初始记录这些值,在之后的更新中一直来记录最小权值。
*/

我将上篇中体到的记录到反向边的标记加上(flag),但仔细想一下,prim改到现在已经失去了它依据的贪心的理念,但总归是有个结果。

(如果有bug,还请留言指正)

针对上一篇prim最后的完善结果的更多相关文章

  1. 完善ext.grid.panel中的查询功能(紧接上一篇)

    今天的代码主要是实现,Ext.grid.panel中的查询,其实我也是一名extjs新手,开始想的实现方式是另外再创建一个新的grid类来存放查询出的数据(就是有几个分类查询就创建几个grid类),这 ...

  2. java 全自动生成Excel之ExcelUtil篇(上一篇的升级版 [针对实体类对象的遍历赋值])

    看了上一篇随笔之后可以对本篇有更好的了解! 使用的poi的jar包依然是上一篇的poi-3.17.jar.... import pojo.UserPojo(上一篇里有,这里就不粘贴了!) 不废话了,直 ...

  3. 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)

    系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 前言 好久不见,很久没更新博客了,前段时间 ...

  4. 【接上一篇】winform中dataGridView高度和宽度自适应填充完数据的高度和宽度,即dataGridView根据数据自适应大小

    上一篇:winform中dataGridView高度自适应填充完数据的高度 winform中dataGridView高度自适应填充完数据的高度,就是dataGridView自身不产生滚动条,自己的高度 ...

  5. phpcms新闻详情页上一篇下一篇的实现

    在新闻详情页(show.html或show_*.html) 只需要添加类似如下代码即可: <div>上一篇:<a href="{$previous_page[url]}&q ...

  6. PHPCMS 实现上一篇、下一篇

    方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...

  7. phpcms V9实现wap上一篇、下一篇功能

    在phpcms\modules\wap\index.php里面,搜索上面这句 if(!$r || $r['status'] != 99) showmessage(L('info_does_not_ex ...

  8. PHP实现上一篇、下一篇

    //php实现上一篇.下一篇 获取当前浏览文章id $id = isset($_GET[ ? intval($_GET['id']) : ""; 下一篇文章 $query = my ...

  9. PHPCMS 实现上一篇下一篇的几种方法

    1第一种 <p>上一篇:{get sql = "select contentid,catid,url,titlee from phpcms_content where conte ...

随机推荐

  1. 【数据结构】之栈(C语言描述)

    栈(Stack)是编程中最常用的数据结构之一. 栈的特点是“后进先出”,就像堆积木一样,堆的时候要一块一块堆到最上面,拆的时候需要从最上面一块一块往下拆.栈的原理也一样,只不过它的操作不叫堆和拆,而是 ...

  2. 【10分钟学Spring】:(一)初识Spring框架

    简介 Spring是一个轻量级的企业级的Java开发框架.主要是用来替代原来更加重量级的企业级Java技术,比如EJB(Enterprise JavaBean).Java数据对象(Java Data ...

  3. VisualStudio2012编辑器错误

    https://blogs.msdn.microsoft.com/webdev/2014/11/11/dialog-box-may-be-displayed-to-users-when-opening ...

  4. SDWebImage学习之 NSCache

    1.使用SDWebImage的好处 1.异步下载(避免主线程卡死) 2.做好图片缓存(这样就不需要每次都加载网络图片) 3.解决了循环利用的问题 很容易造成内存警告

  5. 在modelarts上部署mask-rcnn模型

    最近老山完成了对mask-rcnn在modelarts上的部署,部署模型来自于这个项目.部署的过程大体和我的上篇文章使用modelarts部署bert命名实体识别模型相似,许多细节也不在赘述.这篇文章 ...

  6. python安装matplotlib:python -m pip install matplotlib报错

    matplotlib是python中强大的画图模块. 首先确保已经安装python,然后用pip来安装matplotlib模块. 进入到cmd窗口下,建议执行python -m pip install ...

  7. ajax异步请求的常见方式

    首先先介绍下ajax,ajax(ASynchronous JavaScript And XML)为异步的javascript和xml.所谓的异步和同步是指: 同步:客户端必须等待服务器的响应,在等待期 ...

  8. 带你从头到尾捋一遍MySQL索引结构(2)

    前言 Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结.索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家. 这篇博客我会谈谈对于索引结构我自己的看法,以 ...

  9. 2019牛客全国多校训练四 I题 string (SAM+PAM)

    链接:https://ac.nowcoder.com/acm/contest/884/I来源:牛客网 题目描述 We call a,ba,ba,b non-equivalent if and only ...

  10. HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...