[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 ...
随机推荐
- mysql数据库操作手册
1 存储过程的写法 以下是一个带有入参的存储过程模板, #删除方案-存储过程 CREATE PROCEDURE procPersonAppointRecallPlanByPlanUuidDelet ...
- React组件间通信
众所周知,ReactJS组件与组件之间的通信是一个难点.在React实际开发中,父子组件之间的传值是比较常见的,刚入门的小伙伴很容易被组件之间的通信绕懵. 今天花了点时间总结了一下React父子组件之 ...
- unity3d sqlite数据库的读写方法
首先,我们要从unity的安装路径中复制mono.data.sqlite.dll和sqlite3.dll两个动态链接库到untiy的plugins目录下,如下图所示: 使用navicat for sq ...
- Keras预训练模型下载后保存路径
https://blog.csdn.net/xiaohuihui1994/article/details/83340080
- Java常用的一些容器
转自:https://www.cnblogs.com/LipeiNet/p/5888513.html 前言:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点 ...
- C++:100阶乘数组输出
#include <iostream> using namespace std; int main(){ int i =1; int a[2048]={0}; while(i !=101) ...
- Linux redis服务搭建记录
Redis的安装 1.安装redis需要C语言的编译环境 //gcc在线安装 yum install gcc-c++ 如果提示 /var/run/yum.pid 已被锁定,解决办法,删除yum.pid ...
- CUB reduce errorinvalid configuration argument
解决CUB reduce errorinvalid configuration argument问题 在写TensorFlow代码时遇到报错 CUB reduce errorinvalid confi ...
- centos配置jdk
########## config jdk ########## export JAVA_HOME=/usr/local/java/jdk1.7.0_79 export CLASSPATH=.:${J ...
- 用Comparator排序和分组
Test实体 import java.util.Objects; /** * @author gallen * @description * @date 2018/11/16 * @time 18:5 ...