2121 拆地毯

这篇博客探讨了一种区间类题目——最大生成树问题,并非传统的区间问题。作者采用Kruskal算法来解决,通过边权从大到小排序,构造保留的地毯构成的树形结构。在C++代码实现中,使用了并查集进行路径压缩,以找到包含k条边的最大生成树。

2121 拆地毯

其实我非常不想做这种区间类的题目
貌似这个题不是什么区间
而是最大生成树
?!
牛逼

保留的地毯构成的图中,任意可互相到达的两点间只能有一种方式互相到达

也就是一个树
所以,我们准备用krusal算法

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define IL inline
#define RI register int
using namespace std;
inline void inread(int &x)//快读 
{
    int f=1;x=0;char s=getchar();
    while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
    while(s>='0' and s<='9'){x=x*10+s-'0';s=getchar();}
    x*=f;
}
int fa[100008],n,m,ans,cnt,k;
struct node
{
	int pre,to,w;
	
}edge[400008];
inline bool cmp(const node&a,const node&b)
{
	return a.w>b.w;
}//边权从大到小排序.
inline int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}//路径压缩并查集
inline void kruskal()
{
    sort(edge+1,edge+m+1,cmp);//排序
    for(register int i=1;i<=m;i++)
    {
        register int u=edge[i].pre,v=edge[i].to,w=edge[i].w;
        int fu=find(u),fv=find(v);
        if(fu==fv) continue;
        ans+=w;fa[fv]=fu;
        cnt++;
        if(cnt==k) break;//k边的最大生成树 
    }
}
int main()
{
    inread(n),inread(m);inread(k);
    for(register int i=1;i<=n;i++) 
		fa[i]=i;//并查集初始化为自己 
    for(register int i=1;i<=m;i++) 
    	inread(edge[i].pre),inread(edge[i].to),inread(edge[i].w);
    kruskal();//并查集操作 
    cout<<ans<<endl; 
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值