NCSTOJ :1080 : [啊哈算法]镖局运镖(最小生成树)

本文通过一个关于古代镖局运送镖物的故事背景,介绍了如何使用最小生成树算法来解决遍历多个城镇时所需最低费用的问题。文章详细展示了通过输入各城镇间的连接信息及费用,并利用并查集和排序的方法来找出总费用最低的路线。
摘要由CSDN通过智能技术生成

Description
最近小哼迷上了《龙门镖局》,从恰克图道武夷山,从张家口道老河口,从迪化道佛山,从蒙自道奉天…古代镖局的运镖,也就是现在的物流。镖局每到一个地方开展业务,都需要堆运镖途中的绿林好汉进行打点(不给钱就不让过路)。好说话的打点费就比较低,不好说话的打点费就比较高。城镇类似如下,顶点是城镇编号,边上的值表示这条道路上打点绿林好汉需要的银子数。

请你帮镖局算算,如果从1号城镇出发,遍历每个城镇最少需要准备多少打点银子?

Input
输入第一行包括两个正整数n,m。n代表城镇个数,m表示道路个数(1 < n,m < 100)。

后面的m行分别包含三个正整数a,b,c,表示在从城镇a 到 城镇b的道路上需要交纳的银子数。

Output
输出从1号城镇出发,遍历每个城镇最少需要准备的银子数。
Sample Input
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
Sample Output
19

#include<iostream>
#include<algorithm>

using namespace std;
struct edge{
	int left;
	int right;
	int worth;//存储每一条道路的信息
	 
}e[105];

//判断路径之间是否串联要用到并查集
int n,m;
int f[105];
bool fuction(struct edge e1,struct edge e2)
{
	return e1.worth<e2.worth;
}
void init(){
	for(int i=1;i<=n;i++)
	f[i]=i;
	//对并查集进行初始化
}

int getf(int v)
{
	if(f[v]==v)
	return f[v];
	else{
		f[v]=getf(f[v]);
	
		return f[v];
	}
	
	//判断当前道路最终是与那一条路是想通的
	
	
}


bool merge(int v,int u)
{
  //对不同路径的合并	
	int i,j;
	i=getf(v);
	j=getf(u);
	
	if(i==j)return true;
	else {
	f[j]=i;
	
	
	
	
	return  false;
	
}
	
	
	
}

int main(){
	cin>>n>>m;
	init();
	for(int i=1;i<=m;i++)
	{
		int k1,k2,k3;  //输入路径的信息
		cin>>k1>>k2>>k3;
		e[i].left=k1;
		e[i].right=k2;
		e[i].worth=k3;
		
	}
	
	sort(e+1,e+m+1,fuction);//这里要注意由于并查集的影响该问题中的所有数
	//组都是从1开始的所以排序的时候要注意这一点
	int sum=0,count=0;
	for(int i=1;i<=m;i++)
	{
		if(!merge(e[i].left,e[i].right))//因为是递增的路费的顺序
		{                              //所以只要两条路没有连通就将它们
		//合并并获得该条路的路费
			count++;
			
			sum+=e[i].worth;
			
			
			
		}
		if(count==n-1)break;
	}
	
	cout<<sum;
	
	
	
return 0;

	
	
	
	
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值