针对上一篇prim最后的完善结果
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最后的完善结果的更多相关文章
- 完善ext.grid.panel中的查询功能(紧接上一篇)
今天的代码主要是实现,Ext.grid.panel中的查询,其实我也是一名extjs新手,开始想的实现方式是另外再创建一个新的grid类来存放查询出的数据(就是有几个分类查询就创建几个grid类),这 ...
- java 全自动生成Excel之ExcelUtil篇(上一篇的升级版 [针对实体类对象的遍历赋值])
看了上一篇随笔之后可以对本篇有更好的了解! 使用的poi的jar包依然是上一篇的poi-3.17.jar.... import pojo.UserPojo(上一篇里有,这里就不粘贴了!) 不废话了,直 ...
- 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)
系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 前言 好久不见,很久没更新博客了,前段时间 ...
- 【接上一篇】winform中dataGridView高度和宽度自适应填充完数据的高度和宽度,即dataGridView根据数据自适应大小
上一篇:winform中dataGridView高度自适应填充完数据的高度 winform中dataGridView高度自适应填充完数据的高度,就是dataGridView自身不产生滚动条,自己的高度 ...
- phpcms新闻详情页上一篇下一篇的实现
在新闻详情页(show.html或show_*.html) 只需要添加类似如下代码即可: <div>上一篇:<a href="{$previous_page[url]}&q ...
- PHPCMS 实现上一篇、下一篇
方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...
- phpcms V9实现wap上一篇、下一篇功能
在phpcms\modules\wap\index.php里面,搜索上面这句 if(!$r || $r['status'] != 99) showmessage(L('info_does_not_ex ...
- PHP实现上一篇、下一篇
//php实现上一篇.下一篇 获取当前浏览文章id $id = isset($_GET[ ? intval($_GET['id']) : ""; 下一篇文章 $query = my ...
- PHPCMS 实现上一篇下一篇的几种方法
1第一种 <p>上一篇:{get sql = "select contentid,catid,url,titlee from phpcms_content where conte ...
随机推荐
- vsftpd架设(配置pam模块)
Vsftpd 是很安全的ftp软件 VSFTPD的目录结构 /usr/sbin/vsftpd: VSFTPD的可执行文件 /etc/rc.d/init.d/vsftpd:启动脚本 /etc/vsftp ...
- linux任务计划cron、chkconfig工具、systemd管理服务、unit和target介绍
第8周第1次课(5月14日) 课程内容: 10.23 linux任务计划cron10.24 chkconfig工具10.25 systemd管理服务10.26 unit介绍10.27 target介绍 ...
- PHP 获取服务器详细信息的原生方法
获取系统类型及版本号: php_uname() (例:Windows NT PCA15130 6.1 build 7601 (Windows 7 Ultimate Edition Ser ...
- php踩过的那些坑(2) strpos引发的血案
一.前方有坑 php某些自带函数,如果使用不当,也会坑得你人仰马翻.比如:strpos() 先了解一下strpos()函数是干啥的. strpos — 查找字符串首次出现的位置 用法: int str ...
- 检测是否引入jQuery
if (typeof jQuery != 'undefined') { document.write("jquery已经被加载"); } else { document.write ...
- GItBook命令使用(持续更新)
GitBook基本命令 gitbook init //初始化目录文件 gitbook help //列出gitbook所有的命令 gitbook --help //输出gitbook-cli的帮助信息 ...
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
- tp5实现支付宝电脑支付(详解)
首先吐槽一下支付宝的官方文档,它只是简单介绍一下开发的流程和参数,而对于新人来说如果只看它的官方文档很多时候是看不懂的,我也是边看文档边网上查资料才把它弄懂.下面我详细介绍支付宝的电脑支付是如何实现 ...
- 使用IDEA开发Spring入门程序
使用IDEA开发Spring入门程序 前言 本文通过一个简单的入门程序向读者演示Spring框架的使用过程,具体如下: 一.使用IDEA创建Maven应用项目并导入相应模块 使用IDEA创建一个名为n ...
- HTML5学习第二天!
学习了一天,然后整理内容到现在,感觉昨天的学习效率有点差,哎! 感受尽在代码中,布局真的脑壳疼,仅仅只整理了CSS中的list: <!DOCTYPE html> <html> ...