[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 ...
随机推荐
- Java 集合框架_中
Set接口 特点: [1]Set接口表示一个唯一.无序的容器(和添加顺序无关) Set接口常用实现类有 HashSet [1]HashSet是Set接口的实现类,底层数据结构是哈希表. [2]Hash ...
- 八数码问题(一) 暴力BFS + STL
八数码问题是一个经典的人工智能问题.具体问题不累述了. 思路:由于存在多组测试数据,可以考虑“打表法“.所谓打表法,即枚举所有的初始情况,记录其到达终点的路径.而在这个题目中,顺序打表会调用很多次BF ...
- python基础一 day15 复习
迭代器和生成器迭代器 可迭代协议 —— 含有iter方法的都是可迭代的 迭代器协议 —— 含有next和iter的都是迭代器 特点 节省内存空间 方便逐个取值,一个迭代器只能取一次.生成器 —— 迭代 ...
- 数据库-SQL语法:把一个字段的值设为随机整数
update test2 set zuig = (cast ( ceiling (rand()*9) as int))
- NSRegularExpression 使用
需求: // 后台返回的某个实体 reminder = { cost = , type = , template = 可免费做某事{time}分钟,超过将按{cost}K元收费, time = } t ...
- R,RJAVA 安装配置 详细版
准备工作 系统必须已经安装JDK 并配置好了环境变量. 注:安装的jdk r 以及系统 尽量保持位数一致 1.下载 R https://mirrors.tuna.tsinghua.edu.cn ...
- 快速启动mongodb服务
在桌面创建一个mongodb.bat文件 输入以下内容: D:cd D:\mongodb\binstart mongod --dbpath D:\mongodb\data\dbcd D:\robot\ ...
- 在VMware上安装centos7
1. 下载centos7 64位镜像 linux官网下载:https://www.centos.org/download/ 2. 在VMware上安装centos7 2.1 新建虚拟机 打开虚拟机主页 ...
- sqlmanagementstudio2008下载地址
http://big.wy119.com/sqlmanagementstudio2008_x86_chs.zip
- rs485多主
因复位时I/O口都输出高电平.如果把I/O口直接与RS-485接口芯片的驱动器使能端DE端相连,会在CPU复位其间DE为高,从而使本节点处于发送状态.如果此时总线上其它节点在发送数据,则此次数据传输将 ...