二分+Kruskal【p2798】爆弹虐场
Description
某年某月某日,Kiana 结识了一名爆弹虐场的少年。
Kiana 仗着自己多学了几年OI,所以还可以勉勉强强给这位少年 讲一些自己擅长的题。具体来说,Kiana 先给这位少年灌输了n 个毫不相干的知识点,然后再通过自己的[数据删除]技术把这些知识点强行联系在一起。
由于这位少年有着爆弹虐场的实力,所以对于每个Kiana 准备强行构造的联系,他都能够自己想出来,不过会花费更多的时间。具体来说,Kiana 一共有m 个联系,每个联系可以把两个不相干的知识点连在一起,如果由Kiana 直接来讲第i 个联系,需要花费ti 的时间, 而如果由少年自己想出来,则需要花费Ti 的时间。
为了偷懒,Kiana 只需要自己讲的或少年想出来的联系能刚好把知识点全部直接或间接串在一起就可以了。但为了保证教学质量, Kiana 觉得至少有k 个联系需要少年自己想出来。由于Kiana 耐心有限,她希望无论是自己讲或是少年自己想,构造的联系中花费时间最长的一个用时最短。
现在Kiana 想知道,满足这些条件的情况下,构造的联系中耗时最长的一个的最短用时是多少。由于她不会算,所以希望由你告诉她。
Input
输入文件包括m+1 行。
第一行包含三个正整数n,k 和m,分别表示知识点的数量,Kiana 希望少年自己想出来的联系的数量和联系的总数量。
接下来m 行,每行包含四个正整数a,b,Ti 和ti,表示在知识点a 和b 之间可以构造出一个联系,这个联系由少年自己想出来需要花费 Ti 的时间,而Kiana 直接讲出来需要花费ti 的时间。
Output
输出文件包括一行。
第一行包含一个正整数,表示构造的联系中耗时最长的一个的最短用时。
时间最长用时最短?
显然二分.
又因为最后要求连通即可,因此最后一定是一个最小生成树,
所以二分时间,跑\(Kruskal\)建树即可.
代码
#include<cstdio>
#include<cctype>
#define N 500008
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,k,m,l,r=1e7,f[N],ans;
struct cod{int u,v,w;}edge[N],e[N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
inline bool ok(int x)
{
R int cnt=0;
for(R int i=1;i<=n;i++)f[i]=i;
for(R int i=1;i<=m;i++)
{
R int u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(w>x)continue;
R int fu=find(u),fv=find(v);
if(fu!=fv)f[fu]=fv;
cnt++;
}
if(cnt<k)return false;
for(R int i=1;i<=m;i++)
{
R int u=e[i].u,v=e[i].v,w=e[i].w;
if(w>x)continue;
R int fu=find(u),fv=find(v);
if(fu==fv)continue;
f[fu]=fv;
}
R int ccc=0;
for(R int i=1;i<=n;i++)
{
if(f[i]==i)
{
ccc++;
if(ccc>1)return false;
}
}
return true;
}
int main()
{
in(n),in(k),in(m);
for(R int i=1,a,b,T,t;i<=m;i++)
{
in(a),in(b),in(t),in(T);
edge[i].u=a;edge[i].v=b;edge[i].w=t;
e[i].u=a;e[i].v=b;e[i].w=T;
}
while(l<=r)
{
int mid=(l+r)>>1;
if(ok(mid))r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d",ans);
}
二分+Kruskal【p2798】爆弹虐场的更多相关文章
- 洛谷P2798 爆弹虐场
P2798 爆弹虐场 题目描述 某年某月某日,Kiana 结识了一名爆弹虐场的少年. Kiana 仗着自己多学了几年OI,所以还可以勉勉强强给这位少年 讲一些自己擅长的题.具体来说,Kiana 先给这 ...
- Luogu2798 爆弹虐场 (二分,Kruskal)
二分答案,判定连通性 #include <iostream> #include <cstdio> #include <cstring> #include <a ...
- 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)
题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...
- BZOJ1196 [HNOI2006]公路修建问题 【二分 + Kruskal】
题目 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨在建立O ...
- DOJ1187 : 重建家园 (分数规划 && 二分 && kruskal)
最优答案一定是一颗树 那么二分比值,不断kruskal找到最大可以满足的解就可以了 代码如下 #include <cstdio> #include <algorithm> us ...
- bzoj 2654 tree 二分+kruskal
tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2739 Solved: 1126[Submit][Status][Discuss] Des ...
- [BZOJ2654]tree(二分+Kruskal)
2654: tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2733 Solved: 1124[Submit][Status][Discus ...
- BZOJ 1196 二分+Kruskal
思路: 二分答案 判一下能不能加 //By SirisuRen #include <cstdio> #include <cstring> #include <algori ...
- hdu5288 OO’s Sequence 二分 多校联合第一场
OO's Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
随机推荐
- 【题解】HAOI2008木棍分割
对于这道题目的两问,第一问直接二分答案求出最短长度.关键在于第二问应当如何求:建立dp方程,dp[i][j]代表到第i个分界线,切了j次(强制在第i处切一刀.这样就不会对后面的状态产生影响).状态转移 ...
- 从CUBIC/BBR的TCP ACK失速说起
上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接: TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK: 是的,这是 ...
- ZOJ 3496 Assignment | 二分+有上下界网络流
题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496 大概意思:给你一个网络,有源汇,在保证最大流的情况下求下面两 ...
- 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...
- 从零开始学习MXnet(一)
最近工作要开始用到MXnet,然而MXnet的文档写的实在是.....所以在这记录点东西,方便自己,也方便大家. 我觉得搞清楚一个框架怎么使用,第一步就是用它来训练自己的数据,这是个很关键的一步. 一 ...
- 【SPOJ - QTREE2】树链剖分
http://acm.hust.edu.cn/vjudge/problem/19960 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...
- 【CF1027E】Inverse Coloring(DP)
题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色, 要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反 任意相邻的两列,其颜色也要么相同要么完全相反 且这个矩形中,不存在任意一个大小大于 ...
- Xcode5根控制器使用xib展示的步骤
#error:Xcode5根控制器使用xib展示,步骤 ⓵取消mainInterface ⓶右击file's owner对xib进行view-view连线,否则: Terminating app du ...
- bzoj 2151 贪心
几乎完全类似于1150的思路,直接参考那个就行了. http://www.cnblogs.com/BLADEVIL/p/3527193.html /************************** ...
- BZoj 1003 物流运输 DP+最短路
2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...