uva 11733 Airports 最小生成树

本文介绍了一种利用最小生成树解决城市间建设机场与道路问题的方法。通过构造虚拟节点和边来转换问题,实现所有城市的连通性,并提供了一个具体的C++实现案例。

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

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2833

题意:n个城市,可以在城市建机场,也可以建道路,要让每个城市都拥有一个机场或者通过道路与有机场的城市相连 求最小花费。

题解:假想一个0号城市,在i城市建立机场就等效于在i城市和0城市之间建一条花费为建立机场费用的路,题目的要求就等效于所有城市(包括0城市)联通。所以只要建图的时候,每个点都与0号城市建立花费为a的路,然后跑一遍最小生成树就可以了。

代码:

#include <iostream>
#include <cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int p[100005];
int n,m,a;
struct node {
	int u,v,w;
}e[1000005];
int finde(int x){
	if(p[x]==x)return x;
	return p[x]=finde(p[x]);
}
void unit(int x,int y){
	x=finde(x);
	y=finde(y);
	p[x]=y;
}
bool same(int x,int y){
	x=finde(x);
	y=finde(y);
	if(x==y)return true;
	return false;
}
void in_it(){
	int i;
	for(i=0;i<=n;i++)p[i]=i;
}
bool cmp(node a,node b){
	if(a.w==b.w)return a.u<b.u;//保证在花费相同时优先建机场
	return a.w<b.w;
}
void kru(){
	int i;
	int ans=0,cnt=0;
	sort(e,e+m,cmp);
	for(i=0;i<m;i++){
		if(same(e[i].u,e[i].v))continue;
		if(e[i].u==0)cnt++;
		unit(e[i].u,e[i].v);
		ans+=e[i].w;
	}
	printf("%d %d\n",ans,cnt);
}
int main()
{
	int t,i,icase=0;
	scanf("%d",&t);
	while(t--){
		icase++;
		scanf("%d%d%d",&n,&m,&a);
		for(i=0;i<m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
		for(i=1;i<=n;i++){//与建立机场等效的道路
			e[m].u=0;
			e[m].v=i;
			e[m].w=a;
			m++;
		}
		in_it();
		printf("Case #%d: ",icase);
		kru();
	}
  //  cout << "Hello world!" << endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值