树结构_最小生成树_Prime算法

输入:一个加权连通图

算法思路:将图分为两个部分,一个是已经进入最小生成树的部分a,一个是还未进入最小生成树的部分b

                   现在我们在连接a和b的边中找到一条最小的,并把它加入最小生成树中

                   重复这个过程直到所有点都进入最小生成树

初始化:将第一个点的数据放入最小生成树即可

数学证明:

反证法:假设prim生成的不是最小生成树

1).设prim生成的树为G0

2).假设存在Gmin使得cost(Gmin)<cost(G0)   则在Gmin中存在<u,v>不属于G0

3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)

4).这与prim每次生成最短边矛盾

5).故假设不成立,命题得证.

代码模板:

long Prime(int n,int Graph[maxn][maxn])
{
    int vis[maxn],d[maxn];
    memset(vis,0,sizeof(vis));
    for (int i=1;i<=n;i++)
        d[i]=Graph[1][i];//初始化:从第一个点开始

    for (int i=1;i<=n;i++)//一次找一个点所以需要n次这里的i只是为了计数而已
    {
        int Min=inf,v;
        for (int j=1;j<=n;j++)
            if (!vis[j]&&d[j]<Min)
        {Min=d[j];v=j;}//找出不在集合里的距离最小的点

        vis[v]=1;//这个东西就可以保证d[j]不再变化

        for (int j=1;j<=n;j++)//保证在d[i]为i到连接到以联通的图中的最短路线博主真是太聪明了
            if (!vis[j]&&d[j]>Graph[v][j])
            d[j]=Graph[v][j];
    }

    long cost(0);
    for (int i=1;i<=n;i++)
        cost+=d[i];
    return cost;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值