2021-06-23

这篇博客主要介绍了如何使用C++实现Prim算法,通过并查集处理最小生成树问题。代码中包含了结构体定义、边的排序、初始化、并查集操作以及主函数中的关键步骤,用于读取图的边和权重,并输出最小生成树的总成本。当能构建最小生成树时,程序会输出总成本;否则输出"Impossible"。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=11111;
struct node//结构体建边
{
    int u;
    int v;
    int w;
} p[N];
int vis[N];
bool cmp(node x,node y)
{
    return x.w<y.w;
}
void init(int n)
{
    int i;
    for(i=1; i<=n; i++)
    {
        vis[i]=i;
    }
}
int find1(int i)//并查集
{
    if(vis[i]!=i)
    {
        vis[i]=find1(vis[i]);
    }
    return vis[i];
}
bool join(int u,int v)
{
    int xx=find1(u);
    int yy=find1(v);
    if(xx==yy)
    {
        return true;
    }
    else
    {
        vis[yy]=xx;
        return false;
    }
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        init(n);//初始化数组
        int i;
        for(i=1; i<=m; i++)
        {
            cin>>p[i].u>>p[i].v>>p[i].w;  //输入图的两个端点,边的花费
        }
        sort(p+1,p+1+m,cmp);//排序,边花费最小的排在前面
        int ans=0;//记录边的花费
        int cot=0;//记录多少条边
        for(i=1; i<=m; i++)
        {
            if(!join(p[i].u,p[i].v))//判断两个点是否可以互相到达
            {
                ans=ans+p[i].w;
                cot++;
            }
        }
        if(cot==n-1)//如果建立的边等于顶点数减一,最小生成树成立
        {
        printf("%d\n",ans);
        }
        else
        {
          printf("Impossible\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值