prim算法

prim算法:

第一步:先任意选择一个点作为  最小生成树 的起始点。

第二步:然后找出所有点中 到 最小生成树 的最小距离的点。又加入最小生成树

第三步:然后再更新 所有点 到最小生成树的 距离。

再重复第二三步。一直到n个点都被加入进来了。

例题:hdu 1102

#include<iostream> 
#include<cstdio> 
using namespace std; 
#define INF 0x1f1f1f1f//定义一个整数常量,表示无穷大 
//prim函数返回得到的最小生成树的n-1条边的权值和 
//参数cost 为表示图的矩阵,n为顶点个数 
int prim(int cost[][200],int n) 
{ 
    //low表示每个点到生成树的最小距离,vis表示一个点是否已加入生成树中 
    int low[10000],vis[10000]={0}; 
    int i,j,p; 
    int min,res=0; 
    vis[0]=1; 
    for(i=1;i<n;i++)low[i]=cost[0][i]; 
    for(i=1;i<n;i++) 
    { 
        min=INF;p=-1; 
        for(j=0;j<n;j++) 
        { 
            if(0==vis[j]&&min>low[j]) 
            { 
                min=low[j]; 
                p=j; 
            } 
        } 
        //min==INF说明找不到能够加入的点了,说明图是不连通的 
        if(min==INF)return -1; 
 
        res+=min; 
        vis[p]=1; 
for(j=0;j<n;j++) 
        { 
            if(0==vis[j]&&low[j]>cost[p][j]) 
            { 
                low[j]=cost[p][j]; 
            } 
        } 
    } 
    return res; 
} 
 
int main() 
{ 
    int n; 
    int a[200][200]; 
while(cin>>n) 
    { 
        for(int i=0;i<n;i++) 
        { 
            for(int j=0;j<n;j++) 
            { 
                scanf("%d",&a[i][j]); 
            } 
        } 
        int q; 
        scanf("%d",&q); 
        for(int i=0;i<q;i++) 
        { 
            int u,v; 
            scanf("%d%d",&u,&v); 
            a[u-1][v-1]=a[v-1][u-1]=0; 
        } 
        int res=prim(a,n); 
        printf("%d\n",res); 
    } 
    return 0; 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值