https://www.luogu.org/problemnew/show/P2323

【题目描述】

OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕。所以,OIER Association组织成立了,旨在建立OI island的交通系统。 OI island有n个旅游景点,不妨将它们从1到n标号。现在,OIER Association需要修公路将这些景点连接起来。一条公路连接两个景点。公路有,不妨称它们为一级公路和二级公路。一级公路上的车速快,但是修路的花费要大一些。 OIER Association打算修n-1条公路将这些景点连接起来(使得任意两个景点之间都会有一条路径)。为了保证公路系统的效率, OIER Association希望在这n-1条公路之中,至少有k条(0≤k≤n-1)一级公路。OIER Association也不希望为一条公路花费的钱。所以,他们希望在满足上述条件的情况下,花费最多的一条公路的花费尽可能的少。而你的任务就是,在给定一些可能修建的公路的情况下,选择n-1条公路,满足上面的条件。

【输入输出格式】

  • 输入格式

第一行有三个数n(1≤n≤10000),k(0≤k≤n-1),m(n-1≤m≤20000),这些数之间用空格分开。 N和k如前所述,m表示有m对景点之间可以修公路。以下的m-1行,每一行有4个正整数a,b,c1,c2 (1≤a,b≤n,a≠b,1≤c2≤c1≤30000)表示在景点a与b 之间可以修公路,如果修一级公路,则需要c1的花费,如果修二级公路,则需要c2的花费。

注意,在实际评测时,将只会有 m−1m-1m−1 条公路。

  • 输出格式

输出的第一行有一个数据,表示花费最大的公路的花费。

接下来的 n-1行,每行有两个正整数 t和 p , t 和 p 表示在输入的第 t 对(按照输入的顺序,从1开始标号)景点之间修建 p级公路。

n−1 条公路的输出必选 t 的大小递增,如果有多个方案使花费最大的公路花费最小,那么输出任意一个都可以。

【输入输出样例】

  • 输入样例

    4 2 5
    1 2 6 5
    1 3 3 1
    2 3 9 4
    2 4 6 1
  • 输出样例
    6
    1 1
    2 1
    4 2

  本题是一道半裸的模板题,可以有两种做法,看到关键字“最大的最小值”,可以考虑使用二分答案,本篇博客主要讲解第二种方法——最小生成树。

  首先将一级公路和二级公路分别排序,然后从小到大选k条边加入生成树,剩下的边在二级公路中选择。

  

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxn 20010 using namespace std; int n,m,k,f[],vis[maxn][]; struct road
{
int u,v,w,tim;
}e1[maxn],e2[maxn]; int max(int x,int y)
{
return x<y?y:x;
} int getf(int node)
{
if(node==f[node])
return node;
f[node]=getf(f[node]);
return f[node];
} void meg(int x,int y)
{
int t1=getf(x),t2=getf(y);
if(t1==t2)
return;
f[t2]=t1;
} void qsort(int l,int r,int flag)
{
int i=l,j=r;
if(flag==) {
road mid=e1[(l+r)/];
do
{
while(e1[i].w<mid.w) i++;
while(e1[j].w>mid.w) j--;
if(i<=j)
{
road t=e1[i];
e1[i]=e1[j];
e1[j]=t;
i++;j--;
}
}while(i<=j);
}
else
{
road mid=e2[(l+r)/];
do
{
while(e2[i].w<mid.w) i++;
while(e2[j].w>mid.w) j--;
if(i<=j)
{
road t=e2[i];
e2[i]=e2[j];
e2[j]=t;
i++;j--;
}
}while(i<=j);
}
if(l<j) qsort(l,j,flag);
if(i<r) qsort(i,r,flag);
} int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<m;i++)
{
int x,y,c1,c2;
scanf("%d%d%d%d",&x,&y,&c1,&c2);
e1[i].u=x;e1[i].v=y;e1[i].tim=i;e2[i]=e1[i];
e1[i].w=c1;e2[i].w=c2;
}
qsort(,m-,);
qsort(,m-,);
for(int i=;i<=n;i++)
f[i]=i;
int num=,ans=-;
for(int i=;i<=k;i++)
{
while(getf(e1[num].u)==getf(e1[num].v))
num++;
meg(e1[num].u,e1[num].v);
vis[e1[num].tim][]=;
ans=max(e1[num].w,ans);
}
num=;
for(int i=k+;i<n;i++)
{
while(getf(e2[num].u)==getf(e2[num].v))
num++;
meg(e2[num].u,e2[num].v);
vis[e2[num].tim][]=;
ans=max(e2[num].w,ans);
}
printf("%d\n",ans);
for(int i=;i<m;i++)
{
if(vis[i][])
printf("%d 1\n",i);
else if(vis[i][])
printf("%d 2\n",i);
}
return ;
}

HNOI2006公路修建问题的更多相关文章

  1. 【最小生成树】BZOJ 1196: [HNOI2006]公路修建问题

    1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1435  Solved: 810[Submit][Sta ...

  2. bzoj 1196: [HNOI2006]公路修建问题 二分+并查集

    题目链接 1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1576  Solved: 909[Submit ...

  3. BZOJ 1196: [HNOI2006]公路修建问题( MST )

    水题... 容易发现花费最大最小即是求 MST 将每条边拆成一级 , 二级两条 , 然后跑 MST . 跑 MST 时 , 要先加 k 条一级road , 保证满足题意 , 然后再跑普通的 MST . ...

  4. BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案

    BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1196 分析: ...

  5. BZOJ 1196: [HNOI2006]公路修建问题 Kruskal/二分

    1196: [HNOI2006]公路修建问题 Time Limit: 1 Sec  Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  6. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  7. 1196/P2323: [HNOI2006]公路修建问题

    1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2191  Solved: 1258 Descriptio ...

  8. 洛谷P2323 [HNOI2006] 公路修建问题 [二分答案,生成树]

    题目传送门 公路修建问题 题目描述 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associa ...

  9. BZOJ1196: [HNOI2006]公路修建问题

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织 ...

  10. 1196: [HNOI2006]公路修建问题 - BZOJ

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织 ...

随机推荐

  1. spring中ApplicationListener的用法

    1.实现ApplicationListener接口,并重写onApplicationEvent方法 @Component public class RSAKeyInitListener impleme ...

  2. sse矩阵乘法 应该是1毫秒纯运算1000次

    #include <intrin.h> #include <math.h> struct Vector4 { float x, y, z, w; }; struct Matri ...

  3. Hyperledger Fabric channel配置交易

    一个超级账本区块链网络里每个channel的共享配置都是存储在一个配置交易里.每个配置交易通常被简称为configtx. Channel 配置有以下重要属性: 1.有版本标识:配置里的所有元素都有一个 ...

  4. 服务集群session问题

    1. http协议本身无状态,可通过Session与Cookie记录前端与后端服务器的交互状态: 2. 但是每次客户端回传必须在头信息中带有cookie, 如果session过多,会增加数据传输量: ...

  5. .Net Core+Angular6 学习 第一部分(创建web api)

    . 创建.net core web api 1.1 选择一个empty 模式,里面只有简单的2个class 1.2 配置web api 的路由. 1.2.1 打开Startup.cs,首先引用conf ...

  6. golang反射

    要点 1.变量 2.反射 3.结构体反射 4.反射总结以及应用场景 一.变量介绍 1.变量的内在机制 A.类型信息,这部分是元信息,是预定义好的 B.值类型,这部分是程序运行过程中,动态改变的 var ...

  7. protel dxp 2004安装与破解

    安装准备 压缩文件包内容: dxp2004汉化补丁 dxp2004元件库 Network License Setup网络版注册机 Protel DXP2004原程序 Protel2004_sp2_单机 ...

  8. Kali WSL折腾笔记-在Windows10上使用Kali子系统

    前言 Windows10在发布WSL(Windows Subsystem for Linux)后经过多次更新,现在使用体验已经比较良好,下面简单记录一下我在安装Kali WSL中遇到的种种问题,为各位 ...

  9. 利用js 生成不同li标签的点击事件

    <ul> <li>click me</li> <li>你好啊2</li> <li>你好啊3</li> <li& ...

  10. Oracle中计算两个日期时间的差

    --方法1 select floor((sysdate - to_date('2006-09-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss'))) as sDays fro ...