我们先二分一个答案,对于每个答案,先加一级公路,如果不够k直接break,

然后再加二级公路,加的过程类似Kruskal。

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
var
    n, m, k                 :longint;
    pre1, succ1, c1, c2     :array[..] of longint;
    pre2, succ2             :array[..] of longint;
    father                  :array[..] of longint;
    ans                     :longint;
     
procedure swap(var a,b:longint);
var
    c                       :longint;
begin
    c:=a; a:=b; b:=c;
end;
     
procedure qs1(low,high:longint);
var
    i, j, xx                :longint;
begin
    i:=low; j:=high;
    xx:=c1[(i+j) div ];
    while i<j do
    begin
        while c1[i]<xx do inc(i);
        while c1[j]>xx do dec(j);
        if i<=j then
        begin
            swap(pre1[i],pre1[j]);
            swap(succ1[i],succ1[j]);
            swap(c1[i],c1[j]);
            inc(i); dec(j);
        end;
    end;
    if i<high then qs1(i,high);
    if j>low then qs1(low,j);
end;
 
procedure qs2(low,high:longint);
var
    i, j, xx                :longint;
begin
    i:=low; j:=high;
    xx:=c2[(i+j) div ];
    while i<j do
    begin
        while c2[i]<xx do inc(i);
        while c2[j]>xx do dec(j);
        if i<=j then
        begin
            swap(pre2[i],pre2[j]);
            swap(succ2[i],succ2[j]);
            swap(c2[i],c2[j]);
            inc(i); dec(j);
        end;
    end;
    if i<high then qs2(i,high);
    if j>low then qs2(low,j);
end;
 
procedure init;
var
    i                       :longint;
     
begin
    read(n,k,m);
    for i:= to m- do
    begin
        read(pre1[i],succ1[i],c1[i],c2[i]);
        pre2[i]:=pre1[i]; succ2[i]:=succ1[i];
    end;
    qs1(,m-);
    qs2(,m-);
end;
 
function getfather(x:longint):longint;
begin
    if father[x]=x then exit(x);
    father[x]:=getfather(father[x]);
    exit(father[x]);
end;
 
procedure main;
var
    l, r, mid               :longint;
    i                       :longint;
    fa, fb, a, b            :longint;
    cnt                     :longint;
     
begin
    l:=; r:=;
    while l<=r do
    begin
        mid:=(l+r) div ;
        cnt:=;
        for i:= to n do father[i]:=i;
        for i:= to m- do
        begin
            if c1[i]>mid then break;
            a:=pre1[i]; b:=succ1[i];
            fa:=getfather(a); fb:=getfather(b);
            if fa<>fb then
            begin
                father[fa]:=fb;
                inc(cnt);
            end;
        end;
        for i:= to m- do
        begin
            if (cnt<k) or (c2[i]>mid) then break;
            a:=pre2[i]; b:=succ2[i];
            fa:=getfather(a); fb:=getfather(b);
            if fa<>fb then
            begin
                father[fa]:=fb;
                inc(cnt);
            end;
        end;
        if cnt<n- then l:=mid+ else
        begin
            ans:=mid;
            r:=mid-;
        end;
    end;
    writeln(ans);
end;
 
 
begin
    init;
    main;
end.

bzoj 1196 二分+生成树判定的更多相关文章

  1. BZOJ 1196 二分答案+并查集

    http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...

  2. BZOJ 1196 二分+Kruskal

    思路: 二分答案 判一下能不能加 //By SirisuRen #include <cstdio> #include <cstring> #include <algori ...

  3. bzoj 1196

    http://www.lydsy.com/JudgeOnline/problem.php?id=1196 二分+并查集 一共有2*M条路径,我们首先将这2*M条路径按费用排序. 然后二分最大费用的公路 ...

  4. bzoj 1196 公路修建问题

    bzoj 1196: [HNOI2006]公路修建问题 Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情 ...

  5. [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  6. BZOJ 1196 [HNOI2006]公路修建问题:二分 + 贪心生成树check(类似kruskal)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题意: n个城市,m对城市之间可以修公路. 公路有两种,一级公路和二级公路,在第i对 ...

  7. bzoj 1189 二分+最大流判定

    首先我们可以二分一个答案时间T,这样就将最优性问题 转化为了判定性问题.下面我们考虑对于已知的T的判定 对于矩阵中所有的空点bfs一次,得出来每个点到门的距离, 然后连接空点和每个能在t时间内到达的门 ...

  8. BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...

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

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

随机推荐

  1. Ubuntu 14.04 安装flash插件

    分别tar.gz和apt-get方法 第一种: adboe官网下载tar.gz,进入terminal 1.解压缩包,输入命令“tar -zxvf 软件包名字” 2.拷贝插件到mozilla目录,输入命 ...

  2. jquery 消息提醒插件 toastmessage

    最近做系统,想到使用后台要使用消息提醒,但是一直苦恼消息提醒的效果,于是找了一个toastmessage,还不错.记录下使用的方法. 第一步:引入需要的文件 <script type=" ...

  3. 小课堂week14 Google软件测试之道

    读<Google软件测试之道> 在IT领域,Google是一面旗帜,是一家非常善于思考善于尝试的公司.随着面临挑战的不断增大,传统的测试开展方式也越来越力不从心,这本书讲述的就是一次完整的 ...

  4. 第九章 管理类型(In .net4.5) 之 继承机制

    1. 概述 本章包括 设计和实现接口.创建和使用基类 以及 使用.net类库提供的标准接口. 2. 主要内容 2.1 设计和实现接口 一个接口包含公共的方法.属性.事件.索引器.类和结构都可以实现接口 ...

  5. PHP 文件操作函数大全

    <?php 读取文件夹: $handler = opendir("c:\");//打开文件夹 while($dir = readdir($handler)){//遍历文件夹 ...

  6. Android-简单的sdcard文件浏览

    功能:能够浏览手机里面的文件夹和文件,代码灰常简单 先看布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  7. hdu 5443 The Water Problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Description In Land waterless, ...

  8. JVM学习总结四——内存分配策略

    之前几篇我们介绍了jvm的内存模型以及垃圾回收机制,而本篇我们将介绍几个JVM中对象在分配内存是应该遵循的策略.毕竟,想要去优化程序,不仅要考虑垃圾回收的过程,还要从对象内存分配的角度减少gc的代价. ...

  9. 历时八年,HTML5 标准终于完工了

    万维网联盟(W3C)2014年10月29日泪流满面地宣布,经过几乎8年的艰辛努力,HTML5标准规范终于最终制定完成了,并已公开发布. 在此之前的几年时间里,已经有很多开发者陆续使用了HTML5的部分 ...

  10. EF之高级查询

    首先我们来看看一个页面 这里面有多选的条件,大于,小于等等,包括每个字段都有 如此多的查询条件,我们的后台该如何实现呢? 难道我们还得每个参数都去判断吗? 那得传多少参数进来才能实现这个页面的功能啊! ...