zoukankan      html  css  js  c++  java
  • Prim算法(最小生成树)

    Prim算法通过不断增加最近的点从而生成最小生成树;

    该算法需要寻找最近的点,所有通过数组 dis[i][j] 来保存顶点i和顶点j之间的距离会比较方便;

    Prim算法的重要一点是如何新增一个点 到生成树如何更新其他点到生成的距离:通过比较点j到生成树的距离 dis[j] kj 的距离 edge[k][j] 的大小 ,如果edge[k][j] 小,则将 dis[j] 更新为 edge[k][j] 。

    代码:

    #include <string.h>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include <algorithm>
    #define INF 1<<30
    using namespace std;
    int book[100];//标记顶点是否加入最短生成树
    int edge[100][100];//储存边
    int dis[100];//每个顶点到最小生成树的距离
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<=n;i++){//初始化所有边
            for(int j=0;j<=n;j++){
                if(i==j) edge[i][j]=0;
                else edge[i][j]=INF;
            }
        }
        int s,t,w;
        for(int i=0;i<m;i++){//输入边信息
            cin>>s>>t>>w;
            edge[s][t]=w;//无向图所以需要存两条边
            edge[t][s]=w;
        }
        for(int i=1;i<=n;i++){//初始化所有顶点到仅有源点的最小生成树的距离
            dis[i]=edge[1][i];
        }
        for(int i=0;i<=n;i++){
            book[i]=0;
        }
        book[1]=1;
        int munber=0,sum=0,j,min;
        while(munber<n){
            min=INF;
            for(int i=1;i<=n;i++){//寻找距离生成树最近的点
                if(book[i]==0&&dis[i]<min){
                    min=dis[i];
                    j=i;
                }
            }
            sum+=dis[j];//将最近的点加入生成树
            book[j]=1;
            munber++;
            for(int i=1;i<=n;i++){//更新所有点到生成树的距离
                if(dis[i]>edge[j][i])
                    dis[i]=edge[j][i];
            }
        }
        cout<<sum<<endl;
        return 0;
    }
  • 相关阅读:
    forever守护nodejs
    sql server自动备份
    mongodb数据库自动备份 windows
    mongodb中的objectId和字符串id之间的转换
    mongodb中内嵌数组的增删改查
    nodejs momentjs操作时间(24小时制)
    nodejs 获取某一时间的前一天 后一天
    FastDFS 文件上传成功,访问404
    Ubuntu16.04系统下FastDFS+Nginx安装配置
    ubuntu16.04安装python3.7
  • 原文地址:https://www.cnblogs.com/zdl2234/p/10367655.html
Copyright © 2011-2022 走看看