Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2061  Solved: 1184

Description

OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕。所以,OIER Association组织成立了,旨在建立OI island的交通系统。 OI island有n个旅游景点,不妨将它们从1到n标号。现在,OIER Association需要修公路将这些景点连接起来。一条公路连接两个景点。公路有,不妨称它们为一级公路和二级公路。一级公路上的车速快,但是修路的花费要大一些。 OIER Association打算修n-1条公路将这些景点连接起来(使得任意两个景点之间都会有一条路径)。为了保证公路系统的效率, OIER Association希望在这n-1条公路之中,至少有k条(0≤k≤n-1)一级公路。OIER Association也不希望为一条公路花费的钱。所以,他们希望在满足上述条件的情况下,花费最多的一条公路的花费尽可能的少。而你的任务就是,在给定一些可能修建的公路的情况下,选择n-1条公路,满足上面的条件。

Input

第一行有三个数n(1≤n≤10000),k(0≤k≤n-1),m(n-1≤m≤20000),这些数之间用空格分开。 N和k如前所述,m表示有m对景点之间可以修公路。以下的m-1行,每一行有4个正整数a,b,c1,c2 (1≤a,b≤n,a≠b,1≤c2≤c1≤30000)表示在景点a与b 之间可以修公路,如果修一级公路,则需要c1的花费,如果修二级公路,则需要c2的花费。

Output

一个数据,表示花费最大的公路的花费。

Sample Input

10 4 20
3 9 6 3
1 3 4 1
5 3 10 2
8 9 8 7
6 8 8 3
7 1 3 2
4 9 9 5
10 8 9 1
2 6 9 1
6 7 9 8
2 6 2 1
3 8 9 5
3 2 9 6
1 6 10 3
5 6 3 1
2 7 6 1
7 8 6 2
10 9 2 1
7 1 10 2

Sample Output

5
//二分+最小生成树,把两种路分开存的,这样是为了尽量先选一级公路,然后选二级公路

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 #define MAXN 10005
 8 #define MAXM 20005
 9
10 struct Node
11 {
12     int s,e;
13     int v;
14     bool operator < (const Node& b)const {return v<b.v;}
15 }r1[MAXM],r2[MAXM];
16
17 int n,k,m,r1_n,r2_n;
18 int f[MAXN];
19
20 int Find(int x)
21 {
22     if (x!=f[x])
23         f[x]=Find(f[x]);
24     return f[x];
25 }
26
27 int krus(int cost)
28 {
29     for (int i=1;i<=n;i++) f[i]=i;
30
31     int road=0;
32     int L = 1;
33
34     for (int i=0;i<r1_n;i++)    //一级公路
35     {
36         if (r1[i].v>cost) break;
37         int xx = Find(r1[i].s);
38         int yy = Find(r1[i].e);
39         if (f[xx]!=f[yy])
40         {
41             road++;
42             f[xx]=f[yy];
43             L++;    //连通的个数
44         }
45         if (L==n) break;
46     }
47     for (int i=0;i<r2_n;i++)    //二级公路
48     {
49         if (r2[i].v>cost) break;
50         int xx = Find(r2[i].s);
51         int yy = Find(r2[i].e);
52         if (f[xx]!=f[yy])
53         {
54             f[xx]=f[yy];
55             L++;    //连通的个数
56         }
57         if (L==n) break;
58     }
59     if (road>=k&&L==n)
60         return 1;
61     return 0;
62 }
63
64 int main()
65 {
66     scanf("%d%d%d",&n,&k,&m);
67     r1_n=0;
68     r2_n=0;
69     for (int i=0;i<m-1;i++)
70     {
71         int a,b,c1,c2;
72         scanf("%d%d%d%d",&a,&b,&c1,&c2);
73         r1[r1_n++]=(Node){a,b,c1};
74         r2[r2_n++]=(Node){a,b,c2};
75     }
76     sort(r1,r1+r1_n);
77     sort(r2,r2+r2_n);
78
79     int l=0,r=30000;
80     int ans;
81
82     while (l<=r)
83     {
84         int mid = (l+r)/2;
85         if (krus(mid))
86         {
87             r=mid-1;
88             ans=mid;
89         }
90         else
91             l=mid+1;
92     }
93     printf("%d\n",ans);
94
95     return 0;
96 }

View Code

转载于:https://www.cnblogs.com/haoabcd2010/p/6613680.html

公路修建问题(二分+最小生成树)相关推荐

  1. P1265 公路修建(Prim最小生成树)

    原题链接:公路修建 - 洛谷   思路:其实就是最小生生成树.想想看,如果有2的情况,即三个点ABC,离A最近的点为B,离B最近的点为C,离C最近的点为A.那么把三条边设为a,b,c,即要满足a &l ...

  2. [HNOI2006]公路修建问题 ——二分答案+krukal(蒟弱个人总结)

    题目链接 文章目录 题意: 题解: AC代码 题意: 题目要求我们在n个景点之间建立n-1条公路,在花费尽量少的情况下至少有k条一级公路,求花费最多的一条公路的最小花费 题解: 二分答案+kruska ...

  3. 【BZOJ1196】公路修建问题,二分+最小生成树

    [HNOI2006]公路修建问题 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1534 Solved: 879 Description OI isl ...

  4. bzoj 1196: [HNOI2006]公路修建问题(贪心+最小生成树)

    1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2657  Solved: 1511 [Submit][ ...

  5. 洛谷 P1265 公路修建 题解

    1 题面 公路修建 2 分析 这题特别的地方就是边多,5000×50005000\times 50005000×5000的边用kruscal空间不对. 主要空间瓶颈就是边的权是存不下来的,然而krus ...

  6. BZOJ1196: [HNOI2006]公路修建问题

    [传送门:BZOJ1196] 简要题意: 给出n个点,m-1条边,还有一个约束条件k,每条边可以是一级也可以是二级,一级或二级都需要费用,而一级的费用更高,选出n-1条边将n个点连起来,并且n-1条边 ...

  7. P2323-[HNOI2006]公路修建问题【并查集】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2323 题目大意 有n个点,m条边,对于每条边修二级公路和一级公路修 ...

  8. 广东外语外贸大学第15届程序设计竞赛 - G LZL的柠檬树 - 二分 + 最小生成树

    Problem G: LZL的柠檬树 Time Limit: 1 Sec  Memory Limit: 128 MB Description LZL的柠檬树长出的柠檬可酸了!如果你也想要这棵酸酸的柠檬 ...

  9. 【二分】【最小生成树】公路修建问题(P2323)

    正题 P2323 题目大意 给你n个点和若干边,每条边有两种代价,问你选择n-1条边使得这n个点连通,且选择第一种代价的边不小于k,让你使代价最大值最小 解题思路 二分答案,然后最小生成树,连接可以连 ...

最新文章

  1. 什么是ActiveX插件
  2. 合并排序(Java)-解析
  3. hive转16进制unhex_Java 进制的转换
  4. tomcat源码环境构建
  5. CVE-2021-30116: Kaseya VSA 远程代码执行漏洞
  6. 《智能计算系统》课程报告——《An Efficient FPGA Accelerator Optimized for High Throughput Sparse CNN Inference》学习笔记
  7. 【编辑器】在VSCode中使用JetBrains Clion主题
  8. MT5 MT4 zigzag指标的算法详解
  9. 最简单的C语言无限弹窗
  10. BP神经网络python代码实现
  11. VS2010 SP1 安装慢的原因
  12. 应用统计学与计算机论文,浅谈统计学在生活中的应用
  13. 苹果手机Apple ID 忘记密码 ,频繁跳出登录iCloud如何关闭
  14. Tomcat中包含的配置文件、名字、作用分析记录
  15. 关于logo1_.exe(威金病毒)蠕虫病毒的清楚,
  16. 一文带你认识HTML
  17. 自建app服务器架构特点
  18. java web统计报表_用Java在Web页面上输出统计图 统计报表
  19. 渣男劈腿,两个女生却逼他做出选择,结果......
  20. VsCode与Sublime编辑器优缺点对比

热门文章

  1. Bullsh*t,System. currentTimeMillis大胆用起来,我说的!
  2. 干掉Navicat:正版,MySQL官方客户端真香!
  3. 三种 MySQL 大表优化方案
  4. Nacos 1.3.0 发布, 全新内核构建
  5. 一个女生不主动联系你还有机会吗?
  6. 达观杯_构建模型(二)逻辑回归
  7. 你就是个普通博士,安心去个三四流高校就可以了!杰青优青不是你努力了就能拿到的......
  8. 新冠能被根除吗?医学顶刊BMJ:比根除天花难不少、比脊髓灰质炎容易一点
  9. 一天狂揽2000+星,微软面向初学者ML课程来了,完全免费
  10. 研究生穿实验服满校追羊跑... 因为这是在追奔跑的毕业论文,哈哈哈!