Watering the Fields(irrigation)

本文探讨了kruskal算法在图论中的应用,通过实例展示了如何使用kruskal算法解决最短路径问题。

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

#include <cstdio>
#include <algorithm>
struct edge{
	int f,t,w;
} ed[5000000];
int pl,n,c,i,j,k,l,f[3000],x[3000],y[3000],t,ps,sum,t2;
inline void addedge(int f,int t,int w){
	ed[++pl].t=t;
	ed[pl].w=w;
	ed[pl].f=f;
}
inline int find(int x){
	t=x;
	while(f[x]) x=f[x];
	while(f[t]) t2=f[t],f[t]=x,t=t2;
	return x;
}
bool merge(int a,int b){
	a=find(a),b=find(b);
	if(a==b) return false;
	f[a]=b;
	return true;
}
inline int dist(int x,int y){
	return x*x+y*y;
}
bool cmp(edge a,edge b){
	return a.w<b.w;
}
int main(){
	scanf("%d%d",&n,&c);
	for(i=1;i<=n;++i){
		scanf("%d%d",x+i,y+i);
	}
	t=0;
	for(i=1;i<n;++i){
		for(j=i+1;j<=n;++j){
			if((k=dist(x[i]-x[j],y[i]-y[j]))>=c){
				addedge(i,j,k);
			}
		}
	}
	++pl;
	std::sort(ed+1,ed+pl,cmp);
	ps=n-1;
	i=1;
	while(ps && i<pl){
		if(merge(ed[i].f,ed[i].t)) --ps,sum+=ed[i].w;
		++i;
	}
	if(ps) printf("-1\n"); else printf("%d\n", sum);
	return 0;
}

这个kruskal不知为何丧心病狂地慢..膜拜WJZ大神只有100+ms...700+ms的蒟蒻给跪

转载于:https://www.cnblogs.com/tmzbot/p/4043128.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值