栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

八中生成树1 [MST](C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

八中生成树1 [MST](C++)

前言:

        好久没有更新了,最近学习压力有点大,而且队里学的东西越来越变态,所以近期我会试着更新一些难题,至于水题嘛。。。我们训练时就没有水题。。。

题目:

八中草坪上有N个水龙头,位于(,)
求将个水龙头连通的最小费用。
任意两个水龙头可以修剪水管,费用为欧几里得距离的平方。
校长只愿意修费用大于等于的水管。

输入

第一行给出,
接下来行给出点的坐标x,y
​​​​​​​
,

输出

输出最小费用,如果无解输出

样例输入:

3 11
0 2
5 0
4 3

 样例输出:

46 
 思路:

1:这道题用最小生成树解决,

我用的是Kruskal算法:

其思路在于将每条边按边权从小到大排序,

每次取相对小的边,

用并查集判断连接该边会不会形成图

如果会,则跳过该边

如不会,则进行操作

2:要用到欧几里得距离的知识;

二维空间公式:

代码:
#include
using namespace std;
const int N=2010;
int n;
int c;
int fa[N];
int cnt=0;
int ans=0;
int x[N],y[N];

struct edge {
	int x,y;
	int val;
}e[N*N];

int Euclidean_Metric(int x_x,int x_y,int y_x,int y_y) {//欧几里得距离 
	return (x_x-y_x)*(x_x-y_x)+(x_y-y_y)*(x_y-y_y);//由题意,无需开根 
}

void put (int a,int b) {//建树 
	cnt++;
	e[cnt].x=a;
	e[cnt].y=b;
	e[cnt].val=Euclidean_Metric(x[a],y[a],x[b],y[b]);
}

int find(int x) {
	if(fa[x]!=x)
	    fa[x]=find(fa[x]);
	return fa[x];
}

void unite(int x,int y) {//将x,y放入同一个集合中 
	int p=fa[x],q=fa[y];
	if(p!=q)
	    fa[q]=p;
}

bool cmp(edge a,edge b) {//按边权排序 
	return a.val
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886924.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号