zoukankan      html  css  js  c++  java
  • 针对上一篇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,还请留言指正)

  • 相关阅读:
    iOS MDM证书制作
    iOS 跳转到设置界面
    创建自己的远程私有库
    制作属于自己的cocoapod仓库和spec
    iOS 推送通知证书制作
    自定义导航栏之滑动返回
    xcode使用xib创建cell ,出现崩溃问题
    Xcode使用xib拖线时出现: could not insert new outlet connection
    2014年糯米网校招测试工程师题目解析
    JAVA操作LDAP的详解(JLDAP)
  • 原文地址:https://www.cnblogs.com/yuxi-blog/p/10121695.html
Copyright © 2011-2022 走看看