题目传送门

公路修建问题

题目描述

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条公路,满足上面的条件。

输入

第一行有三个数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的花费。

输出

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

 

输入输出样例

输入样例#1:

4 2 5
1 2 6 5
1 3 3 1
2 3 9 4
2 4 6 1
输出样例#1:

6
1 1
2 1
4 1

  分析:

  最大花费最小,显然的二分答案。

  首先二分最大花费值,然后跑生成树,因为不需要是最小生成树所以可以省略掉排序的过程,然后优先对一等公路跑生成树,跑完生成树以后判断一下就行了。

  Code:

  

//It is made by HolseLee on 20th Aug 2018
//Luogu.org P2323
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std; const int N=1e4+;
const int M=2e4+;
int n,m,K,fa[N],ans,anstot,maxn;
struct Ans{
int id,lv;
}a[M];
struct Road{
int u,v,c1,c2;
}c[M]; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
} inline bool check(int lim)
{
Ans now[M];
for(int i=;i<=n;++i)fa[i]=i;
int num=,cnt=,x,y;
for(int i=;i<m;++i){
if(c[i].c1>lim)continue;
x=find(c[i].u),y=find(c[i].v);
if(x==y)continue;
fa[x]=y;num++;
now[++cnt].id=i,now[cnt].lv=;
}
if(num<K)return false;
for(int i=;i<m;++i){
if(c[i].c2>lim)continue;
x=find(c[i].u),y=find(c[i].v);
if(x==y)continue;
fa[x]=y;
now[++cnt].id=i,now[cnt].lv=;
}
if(cnt>=n-){
for(int i=;i<=cnt;++i)a[i]=now[i];
anstot=cnt;
return true;
}
return false;
} int main()
{
n=read();K=read();m=read();
for(int i=;i<m;++i){
c[i].u=read();c[i].v=read();
c[i].c1=read();c[i].c2=read();
maxn=Max(maxn,Max(c[i].c1,c[i].c2));
}
int l=,r=maxn<<,mid;
while(l<=r){
mid=(l+r)>>;
if(check(mid))r=mid-,ans=mid;
else l=mid+;
}
printf("%d\n",ans);
for(int i=;i<=anstot;++i){
printf("%d %d\n",a[i].id,a[i].lv);
}
return ;
}

洛谷P2323 [HNOI2006] 公路修建问题 [二分答案,生成树]的更多相关文章

  1. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  2. 洛谷 P2323 [HNOI2006]公路修建问题

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 3 4 4 ...

  3. [BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那 里的交通情况还是很糟糕.所以,OIER Association组 ...

  4. [HNOI2006]公路修建问题 (二分答案,并查集)

    题目链接 Solution 二分答案+并查集. 由于考虑到是要求花费的最小值,直接考虑到二分. 然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边. 同时用并查集维护联通块 ...

  5. 1196/P2323: [HNOI2006]公路修建问题

    1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2191  Solved: 1258 Descriptio ...

  6. bzoj 1196: [HNOI2006]公路修建问题 二分+并查集

    题目链接 1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1576  Solved: 909[Submit ...

  7. P2323 [HNOI2006]公路修建问题

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 输出样例# ...

  8. 【洛谷P1265】公路修建

    公路修建 题目链接 分析题意,可以发现,在(1)的条件下,(2)的情况是不会发生的, 于是直接求MST(Min Set Tree) 然而稠密图克鲁斯卡尔会TLE,建图还会爆空间, 所以用prime,用 ...

  9. bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)

    传送门 解题思路 看到最大,肯定要先想二分答案.二分之后首先从小到大枚举\(k\)个小于\(lim\)的所有一级公路,然后用并查集连到一起,然后就在剩下的里面从小到大找n-1-k个二级公路,模仿最小生 ...

随机推荐

  1. NOIP模拟赛9

    T1U3348 A2-回文数 https://www.luogu.org/problem/show?pid=U3348 考场上钻了牛角尖了,然后0分 #include<cstdio> #i ...

  2. Codeforces 807 A Is it rated?

    http://codeforces.com/problemset/problem/807/A A. Is it rated? time limit per test              2 se ...

  3. ZOJ 3964 NIM变形

    LINK 题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败.但是对于alice拥有限制:b=0此堆正常无限制:b=1此堆Alice只能取奇数个石子:b=2只能取偶数个石子 ...

  4. Prufer Code

    1069. Prufer Code Time limit: 0.25 secondMemory limit: 8 MB A tree (i.e. a connected graph without c ...

  5. 重构改善既有代码设计--重构手法19:Replace Data Value with Object (以对象取代数据值)

    你有一笔数据项(data item),需要额外的数据和行为. 将这笔数据项变成一个对象. class Order... private string customer; ==> class Or ...

  6. 动态加载js和css的jquery plugin

    一个简单的动态加载js和css的jquery代码,用于在生成页面时通过js函数加载一些共通的js和css文件. //how to use the function below: //$.include ...

  7. Lua只读表

    利用Lua的元表(metatable)和元函数(metafunction)可以很简单的实现此功能. 其实现大致分为三个部分 1.禁止在表中创建新值 2.禁止改变已有的值 3.将子表也变为只读 1.禁止 ...

  8. 【CodeForces】913 E. Logical Expression

    [题目]E. Logical Expression [题意]令x=11110000(2),y=11001100(2),z=10101010(2),n次询问,每次要求用[与][或][非][括号]构成含至 ...

  9. 【leetcode 简单】第三十七题 相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  10. G6踩坑日记

    用G6去完成一整个图例的时候,当包裹它的容器满足不了包裹的需求时,我们就需要引入缩略图来解决问题了 缩略图使用方式很简单 引入插件配置就可以了 当我们使用多张图片进行绘图(G6支持使用图片进行构图,原 ...