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;
    }
  • 相关阅读:
    python学习(十七) 扩展python
    python学习(十六) 测试
    python学习(十五) 屏幕抓取
    python学习(十四) 网络编程
    python学习(十三) 数据库支持
    python学习(十二) 图形化用户界面
    python学习(十一) 文件和流
    python学习(十) 自带电池
    方法编写经验总结
    如何编写方法
  • 原文地址:https://www.cnblogs.com/zdl2234/p/10367655.html
Copyright © 2011-2022 走看看