prim算法找最小生成树适用于无向图,对于有向加权图会产生错误。

比如

1->2,8

1->3,8

2->3,4

3->2,3

最小生成树1->2->3

而不是3->2;

这是因为2,3之间相互的边在prim算法中无法判断,或者根本意识不到3->2这条边。

我突然想到如果在判断2的最小边时将以2为入度的边的也加入判断,这样就可以遍历到3-》2边,但这样又会产生一个问题,记录下的边是2->3 ,3。

这样就相当于记录了一条方向相反的边,这条边是不存在的。但我们可以在记录这样的边时做个标记,在存储这种边时在进行改正。但这样有些麻烦,不如再写一个KrusKal.

(其实我是偷懒,写prim时生成的图是有向图,但实在不想改太多,所以想了这么个办法来解决,但这个想法好像可以让prim来检测有向图,插一段代码,标记部分没写,如果有错误的地方或者不合适的注释,还请各位指出,鄙人不胜感激)

参考:https://www.cnblogs.com/ShiveryMoon/p/7859360.html

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
for (int i = ; i < this->vertexNum; i++){
U[i] = false;
}
U[cur] = true;
for (int i = ; i < this->vertexNum; i++) {
weight[i] = this->matrix[cur][i];//记录第一个节点与其他节点的权值
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] >= ) {
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;
}
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];
}
}
}
return this->minPath;
}
/*prim:
neighbor记录的是寻找到每个节点的前驱节点。如果在第二个for循环里没有找到以第二个为线索的后继节点,则下一个找到的节点必然以第一个
节点为线索。(初始顶点已知,第一个for循环以初始顶点为线索找到第二个顶点,第二个for循环则以第二个顶点为线索,寻找是否有符合条件的第三个
顶点,如果有,将第三个顶点的前驱(线索)记录到neighbor中,同时跟新权重(weight)值,使得下一次寻找时能够找到第三个顶点。
关于weight,并不是属于初始顶点到各个顶点的权重值,但它初始记录这些值,在之后的更新中一直来记录最小权值。
*/

对于prim的一个有趣但有点奇怪的想法的更多相关文章

  1. dubbo debug过程中一个有趣的问题

    最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...

  2. 【小贴士】关于transitionEnd/animate的一个有趣故事

    前言 在很久之前,我们项目有一个动画功能,功能本身很简单,便是典型的右进左出,并且带动画功能 以当时来说,虽然很简单,但是受限于框架本身的难度,就直接使用了CSS3的方式完成了功能 当时主要使用tra ...

  3. 一个有趣的SQL Server 层级汇总数据问题

        看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题.          具体的问题如下:     parent_id emp_id emp_nam ...

  4. 一个有趣的模拟光照的shader

    一个有趣的模拟光照的shader(类似法线贴图) http://www.cnblogs.com/flytrace/p/3395911.html -----  可否用于需UI中需要加灯的模型.

  5. 一个有趣的 SQL 查询(查询7天连续登陆)

    一个有趣的 SQL 查询 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: . row ********** ...

  6. 另一个有趣的Captcha 网站

    今天在一个网站注册时又发现了一个有趣的Captcha形式.给你一个翻转的图片,然后让你拽下面的slide bar让它回到正常的位置,很有趣.下面是提供这个Captcha的网站. minteye – s ...

  7. 一个有趣的小例子,带你入门协程模块-asyncio

    一个有趣的小例子,带你入门协程模块-asyncio 上篇文章写了关于yield from的用法,简单的了解异步模式,[https://www.cnblogs.com/c-x-a/p/10106031. ...

  8. 一个有趣的js隐式转换的问题

    一个有趣的js隐式转换的问题 在chrome的控制台中打印一下表达式 [] + {} //结果为 [object object] 然后调整顺序打印 {} + [] //结果为 0 然后将两个表达式组合 ...

  9. 举一个有趣的例子,让你轻松搞懂JVM内存管理

    目录 前言 例子 源码 输出 图解 深入分析 学以致用 写在最后 前言 在JAVA虚拟机内存管理中,堆.栈.方法区.常量池等概念经常被提到,对理论知识的理解也常常停留在字面意思上,比如说堆内存中存放对 ...

随机推荐

  1. 后端传给前端Long类型数据,导致精度丢失

    1.前几天遇到了一个问题,后端向前端传递一个Long类型的数据,前端拿到的值不对. 2.当Long类型的数据大于17位时候,就会出现精度丢失的情况. 3.解决办法 我们采用的解决方案是将后端的Long ...

  2. pngquant——一个好用的png压缩工具

    一个可以进行有损图片压缩的命令行工具和代码库. 网址:https://pngquant.org/ 1.为什么选择pngquant 传说中的神器——tinyPng 我们现在用的工具——ImageAlph ...

  3. APM环境搭建

    权限设置 把用户添加到用户组 “dialout”(如果这步没做,会导致很多用户权限问题): sudo usermod -a -G dialout $USER   然后注销后,重新登录,因为重新登录后所 ...

  4. Java基础IO类之字符串流(查字符串中的单词数量)与管道流

    一.字符串流 定义:字符串流(StringReader),以一个字符为数据源,来构造一个字符流. 作用:在Web开发中,我们经常要从服务器上获取数据,数据返回的格式通常一个字符串(XML.JSON), ...

  5. 安装破解版IntelliJ IDEA

    1.下载IntelliJ IDEA http://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.注册码破解 http: ...

  6. virtualenv 在windows下的简单应用

    https://docs.python.org/zh-cn/3/tutorial/venv.html cmd下的操作: pip  install virtualenv pip install virt ...

  7. luogu P1412 经营与开发 |dp

    题目描述 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXplo ...

  8. linux gre隧道创建

    目录 linux gre隧道创建 实验环境 实验目的 实验步骤 1.在host A(10.10.10.47)上面操作 2.在host B(192.168.0.118)上面操作 实验结果 还原实验环境 ...

  9. webpack4.0(三)--动态生成html

    webpack4.0--动态生成html 前言: webpack-dev-server实现了自动编译刷新浏览器,让编译出来的bundle.js托关于服务器根路径(电脑内存)中去.使用--content ...

  10. leetcode -- 寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...