2019 GDUT 新生专题Ⅲ选集 I题 还是畅通工程

I - 还是畅通工程

链接

题目描述
有若干个城镇,给出这些城镇两两之间的距离。为使任意两个城镇间都可以实现公路交通(不一定要直连),求修建公路长度的最小值。

题目分析
由题意可知,该题为最小生成树问题,套用Kruskal算法模板即可。

代码

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

struct edge{
	int from;
	int to;
	int dis;
};

int n,temp;
edge ed[5000];
int root[5000];

void root_init()//初始化
{
	for(int i=1;i<=n;i++)
		root[i]=i;
}

int root_search(int x)//找根
{
	while(root[x]!=x){
		x=root[x];
	}
	return x;
}

void root_combine(int a,int b)//将两个集合结合
{
	a=root_search(a),b=root_search(b);
	if(a!=b) root[b]=a;
}


int kruskal()
{
	int length=0;
	for(int i=1;i<=temp;i++){
		if(root_search(ed[i].from)!=root_search(ed[i].to)){
			length+=ed[i].dis;
			root_combine(ed[i].from,ed[i].to);
		}
	}
	return length;
}

bool cmp(const edge& e1,const edge& e2)
{
	return e1.dis<e2.dis;
}

int main()
{
	while(scanf("%d",&n)!=EOF&&n){
		root_init();
		temp=n*(n-1)/2;
		for(int i=1;i<=temp;i++)
			scanf("%d%d%d",&ed[i].from,&ed[i].to,&ed[i].dis);
		sort(ed+1,ed+temp+1,cmp);
		int ans=kruskal();
		cout<<ans<<"\n";
	}
	return 0;
}
发布了24 篇原创文章 · 获赞 1 · 访问量 675

猜你喜欢

转载自blog.csdn.net/palax0/article/details/104016519