noip模拟题 慰问员工 cheer

【题目描述】
LongDD 变得非常懒, 他不想再继续维护供员工之间供通行的道路. 道路被用来连
接 N(5 <= N <= 10,000)个房子, 房子被连续地编号为 1..N. 每一个房子都是一个
员工的家. LongDD 计划除去 P(N-1 <= P <= 100,000)条道路中尽可能多的道路, 但
是还要保持房子之间的连通性. 你首先要决定那些道路是需要保留的 N-1 条道路.
第 j 条双向道路连接了房子 S_j 和 E_j (1 <= S_j <= N; 1 <= E_j <= N; S_j != E_j),
而且走完它需要 L_j (0 <= L_j <= 1,000)的时间. 没有两个房子 是被一条以上的道
路所连接.
员工们非常伤心, 因为她们的交通系统被削减了. 你需要到每一个员工的住处去安
慰她们. 每次你到达第 i 个房子的时候(即使你已经到过), 你必须花去 C_i (1 <=
C_i <= 1,000)的时间和员工交谈.
你需要从某一个房子出发( 这是供你选择的),并 最终 回到 这个 房子。期间,你要经
过每个房子至少一次,并且当你经过某个房子的时候,你必须和这个房子里的员工
交谈(即使你已经到过).
假设 LongDD 采纳了你的建议, 请计算出使所有员工都被安慰的最少时间.
【输入格式】
* 第 1 行: 用空格隔开的两个整数 N 和 P
* 第 2..N+1 行: 第 i+1 行包含了一个整数: C_i
* 第 N+2..N+P+1 行: 第 N+j+1 行包含用空格隔开的三个整数: S_j, E_j 和 L_j
【输入样例】
5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
4 5 12
【输出格式】
* 第 1 行: 一个整数, 所需要的总时间(包含和在你所在的房子的员工的两次谈话
时间).
【输出样例】

176


#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int father[1000005];
struct pp
{
	int u,v,w;
}e[1000005];
int find(int x)
{
	if(father[x]!=x)
	father[x]=find(father[x]);
	return father[x];
}
void UN(int x,int y)
{
	int a,b;
	a=find(x);
	b=find(y);
	father[a]=b;
}
bool cmp(pp a,pp b)
{
	return a.w<b.w;
}
int n,m,c[100005],k(0),kk(0),ans(0),minn(0x7f),o(0);
int  main()
{
	freopen("cheer.in","r",stdin);
	freopen("cheer.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
	scanf("%d ",&c[i]);
	minn=min(minn,c[i]);
    }
	for(int i=1;i<=m;i++)
	{
		int x ,y, z;
		scanf("%d %d %d",&x,&y,&z);
		k++;
		e[k].u=x;
		e[k].v=y;
		e[k].w=z*2+c[x]+c[y];
	}
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=n;i++)
	father[i]=i;
	while(o<n-1)
	{
		kk++;
		if(find(e[kk].u)!=find(e[kk].v))
		{
		ans+=e[kk].w;
		UN(e[kk].u,e[kk].v);
		o++;
	    }
	}
	printf("%d\n",ans+minn);
	return 0;
}

最小生成树的一道题目。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值