• 最小生成树prim算法示例程序


    n,m表示顶点数和边数。

    lowcost[]存放顶点集合T'内各顶点到顶点集合T内各顶点权值最小的边的权。

    nearvex[]记录顶点集合T'内各顶点距离顶点集合T内那个顶点最近。nearvex[i]为-1时,表示顶点i属于集合T.

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<string>
    #include<cmath>
    #include<map>
    using namespace std;
    
    const int INF=1000000;
    const int maxn=21;
    int n,m;
    int edge[maxn][maxn];
    int lowcost[maxn];
    int nearvex[maxn];
    
    void prim(int u)
    {
        int sumw=0;
        for(int i=1;i<=n;i++)//初始化两个数组  
    { lowcost[i]
    =edge[u][i]; nearvex[i]=u; } nearvex[u]=-1; for(int i=1;i<n;i++)//把剩余n-1个节点扩展进来
    { int min=INF; int v=-1; for(int j=1;j<=n;j++) if(nearvex[j]!=-1 && lowcost[j]<min) { v=j; min=lowcost[j]; } if(v!=-1)//没有找到权值最小的边 { printf("%d %d %d\n",nearvex[v],v,lowcost[v]); nearvex[v]=-1; sumw+=lowcost[v]; for(int j=1;j<=n;j++) if(nearvex[j]!=-1 && edge[v][j]<lowcost[j]) { lowcost[j]=edge[v][j]; nearvex[j]=v; } } } printf("weight of MST is %d\n",sumw); } int main() { int u,v,w; while(~scanf("%d%d",&n,&m)) { memset(edge,0,sizeof(edge)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); edge[u][v]=edge[v][u]=w; } for(int i=1;i<=n;i++)//对邻接矩阵中其他元素赋值 for(int j=1;j<=n;j++) { if(i!=j && edge[i][j]==0) edge[i][j]=INF; } prim(1);//从顶点1出发构造最小生成树 } return 0; }
  • 相关阅读:
    4.JDBC编程
    android 多线程
    android 网络请求Ⅰ
    android 数据存储Ⅱ
    android 数据存储Ⅰ
    android 界面设计基本知识Ⅳ
    《将博客搬至CSDN》
    android 界面设计基本知识Ⅲ
    android 界面设计基本知识Ⅱ
    android 界面设计基本知识
  • 原文地址:https://www.cnblogs.com/54zyq/p/3112028.html
Copyright © 2020-2023  润新知