[HNOI2006]公路修建问题 (二分答案,并查集)
题目链接
Solution
二分答案+并查集.
由于考虑到是要求花费的最小值,直接考虑到二分.
然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边.
同时用并查集维护联通块信息.
最后看连的边数以及\(1\)边是否满足要求即可.
Code
#include<bits/stdc++.h>
using namespace std;
const int maxn=20008;
int n,k,m,v[maxn];
struct sj
{int x,y,w1,w2,id;}a[maxn];
int fa[maxn],ans,pd[maxn];
int find(int x)
{if(fa[x]==x)return x;else return fa[x]=find(fa[x]);}
void join(int x,int y)
{x=find(x),y=find(y);if(x!=y)fa[x]=y;}
bool cmp(sj x,sj y){return x.w1<y.w1;}
int read()
{
int f=1,w=0; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){w=w*10+ch-'0';ch=getchar();}
return f*w;
}
bool jud(int x)
{
for(int i=1;i<=n;i++)fa[i]=i;int cnt=0,js=0;
memset(v,0,sizeof(v));
sort(a+1,a+m,cmp);
for(int i=1;i<m;i++){
if(find(a[i].x)!=find(a[i].y))
if(a[i].w1<=x)cnt++,join(a[i].x,a[i].y),v[a[i].id]=1;}
if(cnt<k)return 0;
for(int i=1;i<m;i++)
{
if(!v[a[i].id])
if(find(a[i].x)!=find(a[i].y))
if(a[i].w2<=x)cnt++,join(a[i].x,a[i].y),v[a[i].id]=2;
}
if(cnt<n-1)return 0;
for(int i=1;i<m;i++)
pd[i]=v[i];
return 1;
}
int main()
{
n=read(),k=read(),m=read();
for(int i=1;i<m;i++)
{a[i].x=read();a[i].y=read();a[i].id=i;
a[i].w1=read();a[i].w2=read();}
int l=1,r=maxn*20;
while(l<=r)
{
int mid=(l+r)/2;
if(jud(mid)){ans=mid,r=mid-1;}
else l=mid+1;
}
printf("%d\n",ans);
for(int i=1;i<m;i++)
if(pd[i])
printf("%d %d\n",i,pd[i]);
}
[HNOI2006]公路修建问题 (二分答案,并查集)的更多相关文章
- [BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树
Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那 里的交通情况还是很糟糕.所以,OIER Association组 ...
- 洛谷P2323 [HNOI2006] 公路修建问题 [二分答案,生成树]
题目传送门 公路修建问题 题目描述 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associa ...
- HNOI2006-公路修建问题(二分答案+并查集)
公路修建问题 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨 ...
- BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...
- bzoj 1196: [HNOI2006]公路修建问题 二分+并查集
题目链接 1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1576 Solved: 909[Submit ...
- bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)
传送门 解题思路 看到最大,肯定要先想二分答案.二分之后首先从小到大枚举\(k\)个小于\(lim\)的所有一级公路,然后用并查集连到一起,然后就在剩下的里面从小到大找n-1-k个二级公路,模仿最小生 ...
- 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- BZOJ 1196 二分答案+并查集
http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...
- HDU-3081-Marriage Match 2(最大流, 二分答案, 并查集)
链接: https://vjudge.net/problem/HDU-3081 题意: Presumably, you all have known the question of stable ma ...
随机推荐
- SizeClass介绍
随着iOS8系统的发布,一个全新的页面UI布局概念出现,这个新特性将颠覆包括iOS7及之前版本的UI布局方式,这个新特性就是Size Class.Size Class配合Auto Layout可以解决 ...
- JavaScript之基操
局部变量前面要加var 如 var name = "jiahuai" 全局变量 name = "jiahuai" 写完每一行JavaScript代码用;号隔 ...
- 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree
和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...
- 【Python学习之六】高阶函数1(map、reduce、filter、sorted)
1.map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回.示例: >>> def ...
- 【mac】【nginx】开机重启
homebrew.mxcl.nginx.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- poj 3614 奶牛美容问题 优先队列
题意:每头奶牛需要涂抹防晒霜,其中有效的范围 min~max ,现在有L种防晒霜,每种防晒霜的指数为 f 瓶数为 l,问多少只奶牛可以涂上合适的防晒霜?思路: 优先队列+贪心 当奶牛的 min< ...
- vi 编辑器命令
插入命令 a append after the cursor A append after the current line i insert before the cursor I insert b ...
- JavaScript: 2015 年回顾与展望
链接:http://www.sitepoint.com/javascript-2015-review/ JavaScript经历了一个不平凡的一年.尽管到5月份已经20年了,关于JS的新闻.项目和兴趣 ...
- 29、在android中采用动画方案来弹出窗口
1.自定义style 2.使用方法: buttonWhat.setOnClickListener(new OnClickListener() { @Override public void onCli ...
- Selenium WebDriver- 隐式等待
隐式等待是只要有一个元素在设置的时间内没有找到,就会报超时 隐式等待是一个全局的设置,只要放在找东西语句的前面,它后面的找东西的语句都会默认等待设置的时间(这里是10秒),这是死等,除非立刻找到了,5 ...