针对上一篇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 ...
随机推荐
- P1548 棋盘问题
题目描述 设有一个N \times MN×M方格的棋盘(1≤N≤100,1≤M≤100)(1≤N≤100,1≤M≤100) 求出该棋盘中包含有多少个正方形.多少个长方形(不包括正方形). 例如:当 N ...
- centos 7 MysSQL 5.7.23 二进制安装
MySQL 5.7.23 二进制安装 CentOS 7 将默认数据库MySQL替换成了Mariadb. 这里会从系统的环境准备开始一步一步安装. 环境准备 系统版本 内核版本 IP地址 Centos ...
- iText + Freemarker实现pdf的导出,支持中文、css以及图片,页眉页脚,页眉添加图片
本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉 ...
- 使用生成对抗网络(GAN)生成手写字
先放结果 这是通过GAN迭代训练30W次,耗时3小时生成的手写字图片效果,大部分的还是能看出来是数字的. 实现原理 简单说下原理,生成对抗网络需要训练两个任务,一个叫生成器,一个叫判别器,如字面意思, ...
- js5——页面转换
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 转:使用JSR-303进行校验 @Valid
一.在SringMVC中使用 使用注解 1.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-validator-4.2.0.Fina ...
- jQuery基础之事件
jQuery基础之事件方法,如下图: 代码实现: <script src="JS/jquery-1.12.4.min.js"></script> <s ...
- idea中自定义快捷键
idea中自定义快捷键 在开发的过程中,总要写一些重复的代码,那么使用自定义快捷键,可以将这些经常用到的代码,自动生成. 1.在idea工具中点击File-->Settings 2.在弹出来的界 ...
- 《手把手教你》系列进阶篇之3-python+ selenium自动化测试 - python几种骚操作你都知道吗?(详细教程)
1. 简介 这篇文章主要是给小伙伴或者童鞋们介绍和分享 python几种骚操:读取配置文件.获取根目录的相对路径.获取系统时间和格式化时间显示.字符串切割等等操作.为后边的自动化框架打下一个结实的基础 ...