针对上一篇prim最后的完善结果

Posted yuxi-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了针对上一篇prim最后的完善结果相关的知识,希望对你有一定的参考价值。

 1 edge* Graph::prim(int cur) {
 2     if (cur >= this->vertexNum) {
 3         return NULL;
 4     }
 5     int *weight = new int[this->vertexNum];
 6     this->minPath = new edge[this->vertexNum - 1];//存储最小生成树的边
 7     int *neighbor = new int[this->vertexNum];//记录与i点距离最近的顶点的编号,应该是找到该节点的前驱节点标记
 8     bool* U = new bool[this->vertexNum];//已加入最小生成树的节点,规定节点在该数组中为true;不在为fasle
 9     bool* flag = new bool[this->vertexNum];//作为prim算法的完善,如果记录的前后边值反向(即记录到错误的边),则将此对应的flag置为false
10     //数组的索引为顶点值,记录的为该索引到其临近的线索边的反向情况。
11     for (int i = 0; i < this->vertexNum; i++){
12         U[i] = false;
13         flag[i]= true;
14     }
15     U[cur] = true;
16     for (int i = 0; i < this->vertexNum; i++) {
17         weight[i] = this->matrix[cur][i]>matrix[i][cur]?matrix[i][cur]:matrix[cur][i];//记录第一个节点与其他节点的权值
18         if (weight[i] == matrix[i][cur] && matrix[cur][i] != matrix[i][cur]) {
19             flag[i] = false;
20         }
21         neighbor[i] = cur;
22     }
23     int index;//记录最小权值边所连接的顶点
24     neighbor[cur] = -1;//
25     for (int i = 1; i < this->vertexNum; i++) {//i表示寻找边的次数,有n个节点,则寻找n-1次,i不参与任何邻接矩阵的寻值
26         int min = INFINIT;
27         for (int j = 0; j < this->vertexNum; j++) {
28             if (min > weight[j] && U[j] == false) {
29                 index = j;
30                 min = weight[j];
31             }
32         }
33         U[index] = true;
34         if (neighbor[index] >= 0) {
35             if (flag[index]==true) {
36                 minPath[i - 1].setValue(neighbor[index], index, min);
37                 /*temp[i].setStartVertex(neighbor[index]);
38                 temp[i].setEndVertex(index);
39                 temp[i].setWeight(min);*/
40                 //不知道为什么始无法通过上述句子给temp[i]赋值,先注释掉
41                 cout << neighbor[index] <<   << index <<   << min << endl;
42             }
43             else{
44                 minPath[i - 1].setValue(index, neighbor[index], min);
45                 cout << index <<   << neighbor[index] <<   << min << endl;
46             }
47         }
48         for (int j = 0; j < this->vertexNum; j++) {
49             if (weight[j] > this->matrix[index][j]|| weight[j] > this->matrix[j][index] && U[j] == false) {
50                 neighbor[j] = index;
51                 weight[j] = this->matrix[index][j] > this->matrix[j][index] ? this->matrix[j][index]: this->matrix[index][j];
52                 if (weight[j] == this->matrix[j][index] && matrix[j][index] != matrix[index][j]) {
53                     flag[j] = false;
54                 }
55             }
56         }
57     }
58     return this->minPath;
59 }
60 /*prim:
61     neighbor记录的是寻找到每个节点的前驱节点。如果在第二个for循环里没有找到以第二个为线索的后继节点,则下一个找到的节点必然以第一个
62     节点为线索。(初始顶点已知,第一个for循环以初始顶点为线索找到第二个顶点,第二个for循环则以第二个顶点为线索,寻找是否有符合条件的第三个
63     顶点,如果有,将第三个顶点的前驱(线索)记录到neighbor中,同时跟新权重(weight)值,使得下一次寻找时能够找到第三个顶点。
64     关于weight,并不是属于初始顶点到各个顶点的权重值,但它初始记录这些值,在之后的更新中一直来记录最小权值。
65 */

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

一句话,代码使我们快乐.(如果有bug,还请留言指正)

 

以上是关于针对上一篇prim最后的完善结果的主要内容,如果未能解决你的问题,请参考以下文章

Unity 入门笔记 - 02 - 各种动画

技术图文:如何利用C# 实现 Prim 最小生成树算法?

一个App完成入门篇-完善主框架

C#开发微信小程序

leetcode-Permutations II-47

为啥此代码片段返回意外结果?