prim算法

 

最小生成树:在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,代价最小生成树则称为最小生成树。

•算法过程
–从单一顶点的树T开始
–不断加入耗费最小的边(u, v),使T∪{(u, v)}仍为树   ——u、v中有一个已经在T中,另一个不在T中

//prim算法求最小生成树
#include <iostream>
#include<cstdio>
#include<cstring>
#define MAX 22
#define VALUE 0xfffff
using namespace std;

int g[MAX][MAX];
int minCost[MAX];//表示被加到最小生成树的点的集合
bool used[MAX];
int v,e;

void createGraph()
{
    int start,end,weight;
    scanf("%d%d",&v,&e);
    //从1开始
    memset(g,0,sizeof(g));
    for(int i=0;i<e;i++)
    {
        scanf("%d%d%d",&start,&end,&weight);
        g[start][end]=weight;
        g[end][start]=g[start][end];
    }
}

//返回最小生成树的总大小
int prim()
{
    for(int i=0;i<=v;i++)
    {
        minCost[i]=VALUE;
        used[i]=false;
    }
    minCost[1]=0;
    int res=0;
	int u;
    while(true)
    {
        int t=-1;
        for(u=1;u<=v;u++)
        {
            if(!used[u] && (t==-1 || (minCost[t]>minCost[u] && minCost[u]!=0)))
                t=u;
        }
        if(t==-1)
            break;
        used[t]=true;
        res+=minCost[t];
        printf("%d\t",minCost[t]);
        for(u=1;u<=v;u++)
        {
            if(minCost[u]>g[t][u]  && g[t][u]!=0)
                minCost[u]=g[t][u];
        }
    }
    return res;
}

int main()
{
    createGraph();
    int path=prim();
    printf("%d\n",path);
    return 0;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯的世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值