洛谷P2798 爆弹虐场
P2798 爆弹虐场
题目描述
某年某月某日,Kiana 结识了一名爆弹虐场的少年。
Kiana 仗着自己多学了几年OI,所以还可以勉勉强强给这位少年 讲一些自己擅长的题。具体来说,Kiana 先给这位少年灌输了n 个毫不相干的知识点,然后再通过自己的[数据删除]技术把这些知识点强行联系在一起。
由于这位少年有着爆弹虐场的实力,所以对于每个Kiana 准备强行构造的联系,他都能够自己想出来,不过会花费更多的时间。具体来说,Kiana 一共有m 个联系,每个联系可以把两个不相干的知识点连在一起,如果由Kiana 直接来讲第i 个联系,需要花费ti 的时间, 而如果由少年自己想出来,则需要花费Ti 的时间。
为了偷懒,Kiana 只需要自己讲的或少年想出来的联系能刚好把知识点全部直接或间接串在一起就可以了。但为了保证教学质量, Kiana 觉得至少有k 个联系需要少年自己想出来。由于Kiana 耐心有限,她希望无论是自己讲或是少年自己想,构造的联系中花费时间最长的一个用时最短。
现在Kiana 想知道,满足这些条件的情况下,构造的联系中耗时最长的一个的最短用时是多少。由于她不会算,所以希望由你告诉她。
输入输出格式
输入格式:
输入文件包括m+1 行。
第一行包含三个正整数n,k 和m,分别表示知识点的数量,Kiana 希望少年自己想出来的联系的数量和联系的总数量。
接下来m 行,每行包含四个正整数a,b,Ti 和ti,表示在知识点a 和b 之间可以构造出一个联系,这个联系由少年自己想出来需要花费 Ti 的时间,而Kiana 直接讲出来需要花费ti 的时间。
输出格式:
输出文件包括一行。
第一行包含一个正整数,表示构造的联系中耗时最长的一个的最短用时。
输入输出样例
4 2 5
1 2 6 5
1 3 3 1
2 3 9 4
2 4 6 1
3 4 4 2
4
说明
对于30%的数据,1<=n<=10,n-1<=m<=15,
对于60%的数据,1<=n<=500,n-1<=m<=1000,
对于100%的数据,1<=k<n<=10000,n-1<=m<=20000,
1<=ti<Ti<=10^6。
数据保证一定存在可行解。
/*
耗时最长的一个的最短用时,二分答案
得到一个期望答案mid后,先看看符合要求的Ti的个数是否大于等于k,如果不是,就直接返回0
如果是,就将符合要求的边,跑一边克鲁斯卡尔看是否能跑出最小生成树来(判断图的连通性),可以的话,返回1,否则返回0
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 20010
using namespace std;
int n,k,m,mid;
struct node{
int from,to,v;
bool operator < (const node b)const{
return v<b.v;
}
}e1[maxn],e2[maxn];
int f[maxn];
int find(int x){
if(x==f[x])return x;
else return f[x]=find(f[x]);
}
bool connect(int x,int y){
int f1=find(x),f2=find(y);
if(f1==f2)return ;
else {
f[f1]=f2;
return ;
}
}
bool check(){
int l=,r=m,md,cnt=;
while(l<=r){
md=(l+r)>>;
if(e2[md].v<=mid)cnt=md,l=md+;
else r=md-;
}
if(cnt<k)return ;
for(int i=;i<=n;i++)f[i]=i;
cnt=;
for(int i=;i<=m;i++){
if(e2[i].v>mid)break;
int x=e2[i].from,y=e2[i].to;
if(connect(x,y))cnt++;
if(cnt>=n-)return ;
}
for(int i=;i<=m;i++){
if(e1[i].v>mid)break;
int x=e1[i].from,y=e1[i].to;
if(connect(x,y))cnt++;
if(cnt>=n-)return ;
}
return ;
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d%d%d",&n,&k,&m);
int x,y,l=0x7fffffff,r=-0x7fffffff;
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&x,&y,&e2[i].v,&e1[i].v);
e1[i].from=e2[i].from=x;
e1[i].to=e2[i].to=y;
l=min(l,min(e1[i].v,e2[i].v));
r=max(r,max(e1[i].v,e2[i].v));
}
int ans=0x7fffffff;
sort(e1+,e1+m+);sort(e2+,e2+m+);
while(l<=r){
mid=(l+r)>>;
if(check())ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
}
洛谷P2798 爆弹虐场的更多相关文章
- 二分+Kruskal【p2798】爆弹虐场
Description 某年某月某日,Kiana 结识了一名爆弹虐场的少年. Kiana 仗着自己多学了几年OI,所以还可以勉勉强强给这位少年 讲一些自己擅长的题.具体来说,Kiana 先给这位少年灌 ...
- Luogu2798 爆弹虐场 (二分,Kruskal)
二分答案,判定连通性 #include <iostream> #include <cstdio> #include <cstring> #include <a ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
- 洛谷P1157 组合的输出
洛谷1157 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. ...
- 【洛谷P1352】没有上司的舞会
[洛谷P1352]没有上司的舞会 x舷售 锚」翅θ 但是 拙臃 蓄ⅶ榔 暄条熨卫 翘ヴ馇 表现无愧于雪月工作室的核心管理 爸惚扎掬 颇瓶 芟缆肝 貌痉了 洵┭笫装 嗝◇裴腋 褓劂埭 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- 洛谷P4891 序列(势能线段树)
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...
- 洛谷:P3281 [SCOI2013]数数 (优秀的解法)
刷了这么久的数位 dp ,照样被这题虐,还从早上虐到晚上,对自己无语...(机房里又是只有我一个人,寂寞.) 题目:洛谷P3281 [SCOI2013]数数 题目描述 Fish 是一条生活在海里的鱼, ...
- 洛谷P1309 瑞士轮(归并排序)
To 洛谷.1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平, ...
随机推荐
- appium-环境搭建(二)
接着上一篇 1.基本的python环境 2.安装node.js,32位还是64位根据自己的系统来选择 3.安装.net framwork4.5 4.安装appium 安装完成后,运行appium.ex ...
- svn_学习_01_TortoiseSVN使用教程
二.参考资料 1.TortoiseSVN新人使用指南 2.
- 关于linux 安装 python pymssql模块
需要先安装freetds是一个开源的C程序库,它可以实现在Linux系统下访问操作微软的SQL数据库.可以用在Sybase的db-lib或者ct-lib库,在里面也包含了一个ODBC的库.允许许多应用 ...
- IE input 去掉文本框的叉叉和密码输入框的眼睛图标
::-ms-clear, ::-ms-reveal{display: none;}
- HihoCoder1665方块游戏([Offer收割]编程练习赛40)(线段树)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在玩一款类似俄罗斯方块的游戏.与原版俄罗斯方块不同的是,落下方块都是长度不一的横向长条,并且不能移动也不能变成竖直方 ...
- bzoj 1006: 神奇的国度 MCS
题目大意: 弦图的最小染色. 题解: 裸题. #include <vector> #include <cstdio> #include <cstring> #inc ...
- 背包搜索--LH
题解:搜索 meet in the middle 先搜一半,假设某个状态的体积是p,那么就要从另一半里找到体积小于 等于v-p 价值最大的状态.二分+前缀和. 代码:不会前缀和,暴力瞎写的.没有评测的 ...
- 【LeetCode】020. Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- BZOJ1727:[Usaco2006 Open]The Milk Queue挤奶队列
我对\(Jhonson\)算法的理解:https://www.cnblogs.com/AKMer/p/9863620.html 题目传送门:https://www.lydsy.com/JudgeOnl ...
- git常见使用情境整理
一.版本回退 回退到某个commit版本的方法如下: 1. 查看commit历史 git log 找到想要回退的版本的号码,eg:f765889 2. 回退到该版本 git reset f765889 ...