首页 > 试题广场 >

旅游

[编程题]旅游
  • 热度指数:1474 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}n 个城市,m 条连接两个城市的双向道路,每条道路有个损坏值 a_i,牛牛手里有 c 元,进行第 k 次修复道路操作时需要 k\times a_i 元。
\hspace{15pt}国家愿意修复损坏值 \le p 的道路,牛牛不需要再花钱修国家帮忙修的路。
\hspace{15pt}牛牛可以自行决定修复哪些道路以及修复它们的顺序。问 p 至少为多少,牛牛才能用不超过 c 元的总花费使得任意两座城市间可以通过修好的道路互相到达。如果国家不需要修复任何道路,输出 0

输入描述:
\hspace{15pt}第一行三个正整数 n,m,c \left(1\le n\le4\times10^4;\,1\le m\le10^5;\,1\le c\le10^{18}\right)
\hspace{15pt}此后 m 行,第 i 行输入三个正整数 x_i,y_i,a_i \left(1\le x_i,y_i\le n;\,1\le a_i\le10^9\right),表示第 i 条边连接城市 x_i 和城市 y_i,损坏值为 a_i。保证无自环,图连通;但是可能存在重边。


输出描述:
\hspace{15pt}在一行上输出一个整数,表示完成目标所需 p 的最小值。
示例1

输入

4 6 7
1 2 3
1 3 4
1 4 6
2 3 2
2 4 1
3 4 5

输出

1

说明

\hspace{15pt}p=1 时,国家免费修复了连接城市 24 的道路。为使所有城市连通,牛牛可以进行如下操作:
\hspace{23pt}\bullet\,修复连接 1,2 的道路,花费 1\times3 元;
\hspace{23pt}\bullet\,修复连接 2,3 的道路,花费 2\times2 元。
\hspace{15pt}共花费 7 元,能达成目标。

备注:
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-11-19 优化题面文本与格式;修正样例解释笔误。
头像 此在Dasein
发表于 2025-11-19 05:07:17
这是一个典型的 图论 + 二分答案 (Binary Search) 问题。我们需要结合 最小生成树 (MST) 的思想和 贪心策略 来解决。 核心思路 二分答案 (Binary Search): 题目要求找到最小的 。 如果我们设定一个阈值 ,国家修好了所有 的路。如果在这个 下牛牛能修通 展开全文
头像 爱音乐的博博
发表于 2023-07-22 16:25:04
本题是一道最小生成树的kruskal算法的题目 先用kruskal算法去记录最小生成树的最短边 然后根据题意所给出的要求去进行迭代更新sum,直至找到一个sum值大于牛牛所投入的资金c,输出最后令 sum>=c的损害值 #include<iostream> #include< 展开全文
头像 quchen666
发表于 2025-11-19 12:47:34
#include <bits/stdc++.h> typedef long long ll; const int N = 2e5+10; using namespace std; struct Node { int u,v; ll w; }e[N]; bool cmp( 展开全文
头像 ddb酱
发表于 2025-11-19 10:06:13
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() 展开全文
头像 Kato_Shoko
发表于 2025-11-19 14:15:45
我们不难发现答案是单调的(政府给得越多,我们越能多修路),贪心来说,我们需要修花费少的n-1条路,那么我们可以使用最小生成树找出需要修的边,再利用二分来查找政府的最小帮助的钱是多少。二分的时候不难发现,我们需要把修路花费钱多的路放在一开始来修,因为如果放在后面修,会累计出来,多增加k倍数的钱。 #i 展开全文
头像 Underage_potato
发表于 2025-11-19 14:33:24
显然只需要 MST 上的那 条边,先求一遍 MST 过程中把边拿出来。 然后找 的时候也不用二分,因为 取值一定是那些边的边权,遍历并判断就行了。 关于答案的计算,一开始只会修 次,因为就那些边,随便算算就行了。 Code: #include<bits/stdc++.h> us 展开全文
头像 smartiphone
发表于 2025-11-19 19:14:28
本道题算是最小生成树的变种吧,写的不是非常熟练,特别是并查集,太少写了,所以犯下了很多低级错误 #include<bits/stdc++.h> #define endl '\n' using namespace std; using ll = long long; class unit 展开全文
头像 czcczz
发表于 2025-11-19 22:40:04
#include<bits/stdc++.h> using namespace std; #define int long long const int N=4e4+10,M=2e4+10; int n,m,c; int f[N]; struct Way{ int dis; int 展开全文