最小生成树算法 prim算法

最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),

同时还要考虑使树的权最小。 prim算法就是一种最小生成树算法。


普里姆算法的基本思想:

从连通网N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。


下面举例说明下prim算法:










例题:poj 2485

    #include <iostream>  
    using namespace std;  
      
    #define INF 70000  
      
    int N;//点的数目  
    int key[500];  
    bool flag[500];  
    int A[500][500];  
      
    int Prim(int r)  
    {  
        int result=0;  
        for(int i=0;i<N;i++)  
        {  
            key[i]=INF;  
            flag[i]=true;  
        }  
        key[r]=0;  
        for(int i=0;i<N;i++)  
        {  
            int min_num=INF;  
            int min;  
            for(int j=0;j<N;j++)  
            {  
                if(flag[j] && min_num>key[j])  
                {  
                    min_num=key[j];  
                    min=j;  
                }  
            }  
            flag[min]=false;  
            if(result<key[min])  
                result=key[min];  
            for(int j=0;j<N;j++)  
            {  
                if(flag[j] && A[min][j] < key[j])  
                    key[j]=A[min][j];  
            }  
        }  
        return result;  
    }  
      
    int main()  
    {  
        int T;  
        cin >> T;  
        while(T--)  
        {  
            cin >> N;  
            for(int i=0;i<N;i++)  
            {  
                for(int j=0;j<N;j++)  
                    scanf("%d",&A[i][j]);  
            }     
            cout << Prim(0) << endl;  
        }  
    }  


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值