zoukankan      html  css  js  c++  java
  • 算法笔记-----最优二叉树--prim算法

     1 //
     2 // Created by alim on 2017/12/21.
     3 //
     4 
     5 #include "iostream"
     6 #include "algorithm"
     7 
     8 using namespace std;
     9 const int INF = 0x3fffffff;//表示无穷大
    10 const int N = 100;//节点最大值
    11 bool s[N];//节点的集合
    12 int closest[N];//最近点数组
    13 int lowcost[N];//最小权值数组
    14 
    15 void Prim(int n,int u0,int c[N][N]){
    16     /**
    17      * 顶点个数n,开始节点u0,带权邻接矩阵c【n】【n】
    18      * 如果s[i]==true,说明顶点i已加入集合(最小生成树);否则属于集合V-U
    19      * 最后结果为lowcost
    20      */
    21     s[u0]=true;
    22     int i,j;
    23     for (int i = 1; i <= n; ++i) {
    24         if (i != u0) {//除u0之外的其他顶点
    25             lowcost[i] = c[u0][i];//u0到其他顶点的距离
    26             closest[i] = u0;//最近点初始化为u0
    27             s[i] = false;
    28         } else {
    29             lowcost[i]=0;
    30         }
    31     }
    32     for (int i = 1; i <= n; ++i) {
    33         int temp = INF;
    34         int t=u0;
    35         for (int j = 1; j <= n; ++j) {//在集合V=U中寻找最近的点
    36             if ((!s[j]) && (lowcost[j] < temp)) {// !s[j] 表示j节点属于集合V-U
    37                 t = j;
    38                 temp = lowcost[j];
    39             }
    40         }
    41         if (t == u0) {
    42             break;//找不到t,跳出循环
    43         }
    44         s[t] = true;
    45         for (int j = 1; j <= n; ++j) {//更新lowcost  closest
    46             if ((!s[j]) && (c[t][j] < lowcost[j])) {
    47                 lowcost[j] = c[t][j];
    48                 closest[j] = t;
    49             }
    50         }
    51     }
    52 }
    53 
    54 int main(){
    55     int n;//用户输入的节点数
    56     int u0;//开始节点
    57     int c[N][N];//邻接矩阵
    58     int m;//边数m
    59     int u,v,w;
    60 
    61     cout << "输入节点数n和边数m:" << endl;
    62     cin >> n >> m;
    63     int sumcost = 0;//总权值
    64     //初始化邻接矩阵
    65     for (int i = 1; i <= n; ++i) {
    66         for (int j = 1; j <= n; ++j) {
    67             c[i][j]=INF;
    68         }
    69     }
    70     cout << "请输入节点u,v  以及权值 w:" << endl;
    71     for (int k = 1; k <= m; ++k) {
    72         cin >> u >> v >> w;
    73         c[u][v]=c[v][u]=w;
    74     }
    75     cout << "请输入任一节点u0:" << endl;
    76     cin>>u0;
    77 
    78     //计算最后的lowcost的总和,即为结果
    79     Prim(n,u0,c);
    80 
    81     cout << "数组lowcost的内容为:" << endl;
    82     for (int l = 1; l <= n; ++l) {
    83         cout<<lowcost[l]<<" ";
    84     }
    85     cout << endl;
    86     for (int i = 1; i <= n; ++i) {
    87         sumcost += lowcost[i];
    88     }
    89     cout << "最短路径为:" << sumcost << endl << endl;
    90     return 0;
    91 }
  • 相关阅读:
    函数
    文件
    字符编码
    卸载python
    mysql修改密码
    playbook
    expect无交互操作
    用户认证
    配置并访问NFS共享
    配置Multipath多路径环境
  • 原文地址:https://www.cnblogs.com/alimjan/p/8079396.html
Copyright © 2011-2022 走看看