java:コンフォートカウ

java:コンフォートカウ

トピック

问题描述
Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上 起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

输入格式
第1行包含两个整数N和P。

接下来N行,每行包含一个整数Ci。

接下来P行,每行包含三个整数Sj, Ej和Lj。

输出格式
输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。
样例输入
5 6
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
样例输出
176
数据规模与约定
5 <= N <= 10000,N-1 <= P <= 1000000 <= Lj <= 10001 <= Ci <= 1,000

分析

首先,N个牧场之间的线路肯定是可以组成一个图,由题意保留N-1条边,可以知道最后是一棵树,又要求耗时最少,那很明显是求最小生成树了
求最小生成树的关键是求出每条边的权值

分析题意:每到一个牧场,就要花费c,并且晚上还要回去睡觉,因此每条边必定要走两次,而且这条边所连接的两个节点都要访问,假设一条边e(u,v),这条边原本的长度为l,在节点u花费的时间为c(u),在节点v话费的时间为c(v),那么这条边真正的权值为2*l+c(u)+c(v),得到了边的权值,我们就可以用最小生成树的算法计算了,这里,我使用了Kruskal算法
————————————————
版权声明:本文为CSDN博主「colorfulshark」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wr132/article/details/43373651

道路被用来连接N个牧场,牧场被连续地编号为1到N。
每一个牧场都是一个奶牛的家。
FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。
你首先要决定那些道路是需要保留的N-1条道路。
第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。//时间为Lj
没有两个牧场是被一条以上的道路所连接。//即最小生成树
你需要到每一个奶牛的住处去安慰她们。//每个奶牛都要去说
每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。//时间为Ci
你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。//每天晚上还要回去居住点,那条路又要多走一遍
在早上 起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。//2ci
这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

边的权值为:
2*l+c(v)+c(u)

この質問はプライムメモリを使用して制限を超えています

https://blog.csdn.net/feilong_csdn/article/details/69359914?ops_request_misc=%7B%22request_id%22%3A%22158235233619725219961791%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158235233619725219961 0&utm_source = distribute.pc_search_result.none-タスク

おすすめ

転載: blog.csdn.net/weixin_44522477/article/details/104441987
おすすめ