试题编号: 201703-4
试题名称: 地铁修建
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述
  A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。
  地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽。
  现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致。而每家公司最多只能修建一条候选隧道。所有公司同时开始施工。
  作为项目负责人,你获得了候选隧道的信息,现在你可以按自己的想法选择一部分隧道进行施工,请问修建整条地铁最少需要多少天。
输入格式
  输入的第一行包含两个整数n, m,用一个空格分隔,分别表示交通枢纽的数量和候选隧道的数量。
  第2行到第m+1行,每行包含三个整数a, b, c,表示枢纽a和枢纽b之间可以修建一条隧道,需要的时间为c天。
输出格式
  输出一个整数,修建整条地铁线路最少需要的天数。
样例输入
6 6
1 2 4
2 3 4
3 6 7
1 4 2
4 5 5
5 6 6
样例输出
6
样例说明
  可以修建的线路有两种。
  第一种经过的枢纽依次为1, 2, 3, 6,所需要的时间分别是4, 4, 7,则整条地铁线需要7天修完;
  第二种经过的枢纽依次为1, 4, 5, 6,所需要的时间分别是2, 5, 6,则整条地铁线需要6天修完。
  第二种方案所用的天数更少。
评测用例规模与约定
  对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 20;
  对于40%的评测用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000;
  对于60%的评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000,1 ≤ c ≤ 1000;
  对于80%的评测用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000;
  对于100%的评测用例,1 ≤ n ≤ 100000,1 ≤ m ≤ 200000,1 ≤ a, b ≤ n,1 ≤ c ≤ 1000000。

所有评测用例保证在所有候选隧道都修通时1号枢纽可以通过隧道到达其他所有枢纽。

问题链接:CCF201703-4 地铁修建
问题简述:(略)
问题分析
如果1到n存在一条最短路径,那么这条路径上权重最大的边即为答案。因为每一段隧道都可以并行修建。
这个题用最小生成树来解决,使用Kruskal算法,在构建最小生成树过程中,如果1和n已经连通,则取其最大边即可。考虑到最小生成树的生成过程,一旦1和n连通,那么最后使得1和n连通的那条边权重最大。因为是最小生成树,则1和n之间不可能有更短的路径(有的话,就不是最小生成树了,矛盾),所以那条权重最大边即为解。
这个题用最短距离算法来解应该是正解。
还有一种做法是用二分实现,代码改自某网友的,有点奇怪。好在数据范围比较小,不然估计会超时。
程序说明:(略)
参考链接:(略)
题记:(略)

100分的C++语言程序(Kruskal算法)如下:

/* CCF201703-4 地铁修建 */#include <bits/stdc++.h>using namespace std;/* 并查集 */
const int N = 100000;
int f[N + 1], fcnt;
void UFInit(int n) {for(int i = 0; i <= n; i++) f[i] = i; fcnt = n;}
int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);}
int Union(int a, int b) {if ((a = Find(a)) != (b = Find(b))) {f[a] = b, fcnt--; return 1;} else return 0;}const int M = 200000;
struct Edge {int u, v, w;bool operator< (const Edge & u) const {return w<u.w;}
} e[M];int main()
{std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);int n, m;cin >> n >> m;for (int i = 0; i < m; i++)cin >> e[i].u >> e[i].v >> e[i].w;/* 初始化并查集 */UFInit(n);/* Kruskal算法 */sort(e, e + m);int ans = 0;for (int i = 0; i < m; i++) {if (Union(e[i].u, e[i].v))ans = e[i].w;if (Find(1) == Find(n)) break;}/* 输出结果 */cout << ans << endl;return 0;
}

100分的C++语言程序(二分+BFS)如下:

/* CCF201703-4 地铁修建 */#include <bits/stdc++.h>using namespace std;const int N = 100000;
struct Edge
{int v, w;Edge(int v1, int w1) {v = v1; w = w1;}
};
vector<Edge> g[N + 1];
int n, vis[N + 1];int judge(int maxw)
{memset(vis, 0, sizeof vis);queue<int> q;q.push(1);while (!q.empty()) {int t = q.front();q.pop();if (t == n) return 1;else {for (int i = 0; i < (int)g[t].size(); i++) {int v = g[t][i].v;int w = g[t][i].w;if (w <= maxw && !vis[v]) {q.push(v);vis[v] = 1;}}}}return 0;
}int main()
{std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);int m, maxw = 0;cin >> n >> m;for (int i = 0; i < m; i++) {int u, v, w;cin >> u >> v >> w;g[u].push_back(Edge(v, w));g[v].push_back(Edge(u, w));maxw = max(maxw, w);}int left = 1, right = maxw;while ( left < right) {int mid = (left + right) >> 1;if (judge(mid)) right = mid;else left = mid + 1;}cout << left << endl;return 0;
}

CCF201703-4 地铁修建(100分)【Kruskal算法+二分+最短路】相关推荐

  1. CCF201812-4 数据中心(100分)【Kruskal算法】

    试题编号: 201812-4 试题名称: 数据中心 时间限制: 1.0s 内存限制: 512.0MB 样例输入 4 5 1 1 2 3 1 3 4 1 4 5 2 3 8 3 4 2 样例输出 4 样 ...

  2. ccf 201703-4 地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

  3. 7-1 内存分区分配--首次适应算法 (100 分)

    一:题目7-1 内存分区分配–首次适应算法 (100 分) 宝 今天你看我博客了吗 输入内存的大小和阈值minsize,按照首次适应算法进行连续的分区分配.在划分时,若剩余的内存小于等于minsize ...

  4. 浙大数据结构:08-图7 公路村村通 (30 分)Prim与Kruskal算法

    08-图7 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N( ...

  5. 公路村村通 (30分)【C语言】Prim算法 和 Kruskal算法

    目录 题目: 输入格式 输出格式 输入样例 输出样例 问题分析 最小生成树的特点 算法 Prim算法 代码实现 Prim函数:小树变大的过程中记录fee(费用和)和count(已收集的边数) Find ...

  6. PTA 数据结构与算法题目集(中文) 7-10 公路村村通 (30分) 最小生成树(kruskal算法)

    我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机.地理信息科学知识库 > 还有不少 ...

  7. 7-10 公路村村通 (30分) C++ kruskal算法

    题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M( ...

  8. 【NOJ1596、1597】【贪心算法之最小生成树】最少修建多长的公路能把所有村庄连起来(图示Prim与Kruskal算法)

    1596.最少修建多长的公路能把所有村庄连起来(一) 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一个地区有n个村庄,有一些村子之间可以修路,已知每条路的长度,问最少修建 ...

  9. 最小生成树(Kruskal算法+Prim算法)简单讲解+最小生成树例题 acm寒假集训日记22/1/8

    算法简讲部分: Kruskal算法: 基于贪心策略大致过程分为第三步:1. 我们先用结构体把每条边的端点和权值记录下来,然后对每条边按权值进行排序2. 因为 使图连通最少需要n-1 条边,所以我们依次 ...

最新文章

  1. 面试官:有了 for 循环 为什么还要 forEach ?
  2. 英特尔二号人物被解雇:7nm全面落后,芯片还要外包代工
  3. DIP第三章习题解答
  4. 如何使用IcoMoon字体图标
  5. touch事件总结,监听屏幕点击事件
  6. nginx 与php版本,nginx-php不同版本问题
  7. MATLAB之基本语法与基础函数
  8. 模版 ----- 实数二分
  9. 关于wsgi协议的理解
  10. python定时任务_Python定时任务工具--APScheduler
  11. python批量处理word格式_python自动化办公(V1.0)批量修改word文档格式
  12. 配置销售开票时结转销售成本
  13. Wondows Sever 2003密钥【收集】
  14. 计算机网络-自顶向下方法 读书笔记
  15. 如何组织可持续的团队内部分享
  16. 自封装验证手机号码、邮箱格式、身份证号的工具
  17. (投影:Projector)Unity Projector 投影器原理以及优化
  18. (四)activiti的几个核心类
  19. Error receiving broadcast Intent com.android.vending.billing PURCHASES_UPDATED flg=0x10 has extras
  20. PDF文件合并 –Python

热门文章

  1. 毕业设计论文封面模板
  2. 移动端前端UI框架推荐
  3. hive,skynet以及go语言
  4. 在c#使用Windows IOCP(完成端口)编程研究
  5. 服务器提交任务和直接运行,实现简单服务器学习多线程与Executor
  6. mysql 跳过checksum_MySQL-Utilities:mysqldbcompare及跳过复制错误
  7. c++ arm 图像处理_方案解析丨如何在ARM平台搭建超声波无损探伤系统
  8. 金蝶站点重新输入服务器ip,金蝶KIS客户端和服务器不在同一IP段互相访问
  9. 配置ssd为缓存_SSD小讲堂丨新电脑剪视频还卡?原因给你们找到了!
  10. Java原始客户端操作Mongodb 增删改查