标签:更新 for循环 反向 path 标记 val graph ret 邻接矩阵
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,还请留言指正)
标签:更新 for循环 反向 path 标记 val graph ret 邻接矩阵
原文地址:https://www.cnblogs.com/yuxi-blog/p/10121695.html