题意:给出一个图,每条边有权值和花费c,每次花费c能使的权值-1。给出一个预算,求减完权值后的一个最小生成树。

思路:感谢CC大神

有这样一个结论:最佳方案里必定存在一种,预算全部花费全部分配在一条边上。证明显然,对于任意一组解,都可以在内部再分配预算使总费用更小或不变。

于是先求出原图的最小生成树,枚举每条边。

对于在生成树中的,判断使这条边减费是否更优。

不在生成树上的,找出树上从x[i]到y[i]的路径(唯一)上a[i]最大的边,判断删除那条边并加入减费后的(x[i],y[i])是否更优。

 type yjs=record
a:longint;
s:int64;
end;
var f,q,g:array[..,..]of longint;
head,vet,next,len,num,a,b,c,x,y,dep,fa,inq,ya,yb:array[..]of longint;
hth,mst,s:int64;
tot,n,m,i,del,k,tx,ty:longint;
t:yjs; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=a[(l+r)>>];
repeat
while mid>a[i] do inc(i);
while mid<a[j] do dec(j);
if i<=j then
begin
swap(a[i],a[j]); swap(b[i],b[j]); swap(c[i],c[j]);
swap(x[i],x[j]); swap(y[i],y[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; procedure add(a,b,c,d:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
num[tot]:=d;
head[a]:=tot;
end; function lca(x,y:longint):longint;
var i,d:longint;
begin
if dep[x]<dep[y] then swap(x,y);
d:=dep[x]-dep[y];
for i:= to do
if d and (<<i)> then x:=q[x,i];
for i:= downto do
if q[x,i]<>q[y,i] then
begin
x:=q[x,i]; y:=q[y,i];
end;
if x=y then exit(x);
exit(q[x,]);
end; function clac(x,y:longint):yjs;
var i,d:longint;
cc:yjs;
begin
if dep[x]<dep[y] then swap(x,y);
d:=dep[x]-dep[y];
cc.a:=; cc.s:=-maxlongint;
for i:= downto do
if d and (<<i)> then
begin
if f[x,i]>cc.s then
begin
cc.a:=g[x,i];
cc.s:=f[x,i];
end;
x:=q[x,i];
end;
exit(cc);
end; function ask(x,y:longint):yjs;
var t:longint;
t1,t2:yjs;
begin
t:=lca(x,y);
t1:=clac(x,t);
t2:=clac(y,t);
if t1.s>t2.s then exit(t1);
exit(t2);
end; function find(k:longint):longint;
begin
if fa[k]<>k then fa[k]:=find(fa[k]);
find:=fa[k];
end; procedure dfs(u,pre:longint);
var e,v,i:longint;
begin
for i:= to do
begin
if dep[u]<(<<i) then break;
q[u,i]:=q[q[u,i-],i-];
if f[u,i-]<f[q[u,i-],i-] then
begin
f[u,i]:=f[q[u,i-],i-];
g[u,i]:=g[q[u,i-],i-];
end
else
begin
f[u,i]:=f[u,i-];
g[u,i]:=g[u,i-];
end;
end;
e:=head[u];
while e<> do
begin
v:=vet[e];
if v<>pre then
begin
dep[v]:=dep[u]+;
f[v,]:=len[e];
q[v,]:=u;
g[v,]:=num[e];
dfs(v,u);
end;
e:=next[e];
end;
end; begin readln(n,m);
for i:= to m do read(a[i]);
for i:= to m do read(b[i]);
for i:= to m do c[i]:=i;
for i:= to m do readln(x[i],y[i]);
readln(s);
ya:=a; yb:=b;
qsort(,m);
for i:= to n do fa[i]:=i;
for i:= to m do
begin
tx:=find(x[i]); ty:=find(y[i]);
if tx<>ty then
begin
fa[ty]:=tx;
hth:=hth+a[i];
inq[c[i]]:=;
add(x[i],y[i],a[i],c[i]);
add(y[i],x[i],a[i],c[i]);
end;
end;
dfs(,-);
mst:=hth;
for i:= to m do
if inq[c[i]]= then
begin
if mst-s div b[i]<hth then
begin
hth:=mst-s div b[i];
k:=c[i];
end;
end
else
begin
t:=ask(x[i],y[i]);
if mst-ya[t.a]+a[i]-s div b[i]<hth then
begin
hth:=mst-ya[t.a]+a[i]-s div b[i];
k:=c[i];
del:=t.a;
end;
end;
writeln(hth);
for i:= to m do
begin
if i=del then continue;
if i=k then begin writeln(i,' ',ya[i]-s div yb[i]); continue; end;
if inq[i]= then writeln(i,' ',ya[i]);
end; end.

【CF733F】Drivers Dissatisfaction(最小瓶颈生成树,倍增)的更多相关文章

  1. 【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)

    [题意] n个点m条边的图 q次询问 找到一条从s到t的一条边 使所有边的最大危险系数最小 InputThere will be at most 5 cases in the input file.T ...

  2. 【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市

    本意是求最小瓶颈生成树,但是我们可以证明:最小生成树也是最小瓶颈生成树(其实我不会).数据范围很小,暴力kruscal即可. #include<cstdio> #include<al ...

  3. POJ 1861 ——Network——————【最小瓶颈生成树】

    Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15268   Accepted: 5987   Specia ...

  4. 【bzoj2429】[HAOI2006]聪明的猴子(图论--最小瓶颈生成树 模版题)

    题意:有M只猴子,他们的最大跳跃距离为Ai.树林中有N棵树露出了水面,给出了它们的坐标.问有多少只猴子能在这个地区露出水面的所有树冠上觅食. 解法:由于要尽量多的猴子能到达所有树冠,便用Kruskal ...

  5. UVA 11354 Bond(最小瓶颈路+倍增)

    题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...

  6. CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】

    F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  7. luogu p2330[SCOI05] 繁忙的都市——瓶颈生成树

    P2330 05四川 繁忙的都市 题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道 ...

  8. 瓶颈生成树与最小生成树 POJ 2395 Out of Hay

    百度百科:瓶颈生成树 瓶颈生成树 :无向图G的一颗瓶颈生成树是这样的一颗生成树,它最大的边权值在G的所有生成树中是最小的.瓶颈生成树的值为T中最大权值边的权. 无向图的最小生成树一定是瓶颈生成树,但瓶 ...

  9. POJ 2395 Out of Hay 草荒 (MST,Kruscal,最小瓶颈树)

    题意:Bessie要从牧场1到达各大牧场去,他从不关心他要走多远,他只关心他的水袋够不够水,他可以在任意牧场补给水,问他走完各大牧场,最多的一次需要多少带多少单位的水? 思路:其实就是要让所带的水尽量 ...

随机推荐

  1. vs2015驱动开发中使用RtlStringCchPrintfW()报错

    法一: 在头顶添加一段代码 #pragam comment(lib,"xxxxxx.lib") 法二: 右击工程点属性,选择Linker下的Input,在依赖项后面写上$(DDK_ ...

  2. 标签input的value属性和placeholderde 区别

    placeholder 顾名思义是一个占位符 在你的value为空的时候他才会显示出来,但是他本身并不是value,也不会被表单提交.

  3. Java基础操作面试题:Map集合排序 需要TreeMap 构造方法参数有比较器 输入字符串,统计A、B、C、D、出现次数,由高到低输出字母和出现次数,使用Map集合完成此题

    Map和Collections是同级别的,不能像List排序那样直接用Collections.sort(new Comparator<?>(){ 复写compara方法}); HashMa ...

  4. 【netbeans】【ubuntu】ubuntu netbeans 抗锯齿化修复

    每一个在ubuntu下用netbeans的,都会对它的字体怎么会显示的那么难看表示很不理解.我就是因此几乎没有用netbeans的.   不过今天终于解决问题了,虽然没有eclipse显示的那么漂亮, ...

  5. JdbcTemplate实验

    实验1:测试数据源 @Test public void test() throws SQLException { ApplicationContext ioc = new ClassPathXmlAp ...

  6. LeetCode(173) Binary Search Tree Iterator

    题目 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ...

  7. LeetCode(205)Isomorphic Strings

    题目 Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ch ...

  8. viewController备注

    1.按结构可以对iOS的所有ViewController分成两类: 1).主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UIT ...

  9. ASP.NET Web网站中App_Code文件夹的作用及使用场景

    原文地址:Web Site项目和ASP.NET Web Application中App_Code文件夹的作用作者:宾的宾 我现在要建一个ASP.NET的网站了,不难吧,开始动手.如下图: 这种方法建立 ...

  10. 算法导论 第七章 快速排序(python)

    用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍   def PARTITION(A,p,r): x = ...