[BZOJ1196] [HNOI2006]公路修建问题

原创 2015年11月20日 23:25:51

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=1196

题目大意

给定一个图,有一级道路和二级道路,要求一级道路数量不少于k,求其生成树中最大边最小的值

题解

很明显的二分答案
验证时,用Kruskal判断,先扫一遍一级数值小于答案加入,如果条数小于k返回不行,扫所有数值小于答案的,条数为n-1的返回可以
反之不行

var
 x:array[0..50000,1..4]of longint;
 sum,fa:array[0..10005]of longint;
 i,j,k:longint;
 n,m,t:longint;
 a,b,c,d:longint;
 ans,l,r,mid,summ:longint;
procedure sort(l,r:longint);
var i,j,a,b:longint;
begin
 i:=l; j:=r; a:=x[(l+r) div 2,3];
 repeat
  while x[i,3]<a do inc(i);
  while a<x[j,3] do dec(j);
  if not(i>j) then
   begin
    b:=x[i,1]; x[i,1]:=x[j,1]; x[j,1]:=b;
    b:=x[i,2]; x[i,2]:=x[j,2]; x[j,2]:=b;
    b:=x[i,3]; x[i,3]:=x[j,3]; x[j,3]:=b;
    b:=x[i,4]; x[i,4]:=x[j,4]; x[j,4]:=b;
    inc(i); dec(j);
   end;
 until i>j;
 if l<j then sort(l,j);
 if i<r then sort(i,r);
end;

function get(a:longint):longint;
begin
 if fa[a]=a then exit(a);
 fa[a]:=get(fa[a]);
 exit(fa[a]);
end;

function check(ans:longint):longint;
begin
 summ:=0;
 for i:=1 to n do
  fa[i]:=i;
 for i:=2*m-2 downto 1 do
  begin
   if x[i,3]>ans then continue;
   if x[i,4]=0 then continue;
   a:=get(x[i,1]); b:=get(x[i,2]);
   if a<>b then begin inc(summ); fa[a]:=b; end;
  end;
 if summ<t then exit(0);
 for i:=1 to 2*m-2 do
  begin
   if x[i,3]>ans then continue;
   a:=get(x[i,1]); b:=get(x[i,2]);
   if a<>b then begin inc(summ); fa[a]:=b; end;
  end;
 if summ=n-1 then exit(1) else exit(0);
end;

begin
 readln(n,t,m);
 for i:=1 to m-1 do
  begin
   readln(a,b,c,d);
   x[i*2-1,1]:=a; x[i*2-1,2]:=b; x[i*2-1,3]:=c; x[i*2-1,4]:=1;
   x[i*2,1]:=a; x[i*2,2]:=b; x[i*2,3]:=d; x[i*2,4]:=0;
  end;
 sort(1,2*m-2); {x[i,3]}
 l:=1; r:=x[2*m-2,3];
 while l<r do
  begin
   mid:=(l+r)>>1;
   if check(mid)=1
   then r:=mid
   else l:=mid+1;
  end;
 writeln(l);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ1196: [HNOI2006]公路修建问题

刷水题一直不好意思写单篇题解,直到我看见了这道题。
  • QWsin
  • QWsin
  • 2017年05月24日 20:57
  • 332

bzoj1196[HNOI2006]公路修建问题

Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕。所以,OIER Associatio...
  • zhb1997
  • zhb1997
  • 2014年06月14日 23:11
  • 508

bzoj1196: [HNOI2006]公路修建问题

传送门 二分答案。 显然我们应该尽可能的选择能选的一级公路。 如果不能选再选二级公路。 判断方案是否可行即可。var a,b,c,d,f:array [0..30005] of longi...
  • zhouyuyang233
  • zhouyuyang233
  • 2017年04月04日 11:45
  • 459

【BZOJ1196】[HNOI2006]公路修建问题【二分】【并查集】

【题目链接】 二分最大边权,把不大于mid的边做个生成树。 因为只要保证最大值不超过mid即可,具体边权、边权总和无所谓的。 /* Telekinetic Forest Guard */...
  • BraketBN
  • BraketBN
  • 2016年05月20日 15:22
  • 145

[BZOJ1196][HNOI2006]公路修建问题(最小生成树)

明天晚上就可以回家了!后天可以在车上颓废了哈哈哈哈
  • FromATP
  • FromATP
  • 2017年06月13日 07:18
  • 193

BZOJ1196 [HNOI2006]公路修建问题 【二分 + Kruskal】

题目OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕。所以,OIER Association组织成立了,旨在建立OI...
  • qq_38678604
  • qq_38678604
  • 2017年12月26日 22:19
  • 53

bzoj1196 公路修建问题

bzoj 1196: [HNOI2006]公路修建问题DescriptionOI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还...
  • LGD_HXL
  • LGD_HXL
  • 2017年04月01日 10:24
  • 238

bzoj1196 [HNOI2006]公路修建问题 二分

题意:看链接吧,懒得写了,很好懂。 十分简单的二分,判断跟mst差不多。#include #include #include #define fo(i,a,b) for(int i=a;i=b;i-...
  • qq_35866453
  • qq_35866453
  • 2017年10月02日 16:17
  • 55

BZOJ1196(HNOI2006)[公路修建问题]--二分

bzoj1196
  • CHNWJD
  • CHNWJD
  • 2017年12月12日 20:44
  • 101

BZOJ1196: [HNOI2006]公路修建问题 二分+Kruskal

1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1800  Solved: 1033 [S...
  • Oakley_
  • Oakley_
  • 2016年08月30日 21:21
  • 342
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[BZOJ1196] [HNOI2006]公路修建问题
举报原因:
原因补充:

(最多只允许输入30个字)