【CF733F】Drivers Dissatisfaction(最小瓶颈生成树,倍增)
题意:给出一个图,每条边有权值和花费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(最小瓶颈生成树,倍增)的更多相关文章
- 【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
[题意] n个点m条边的图 q次询问 找到一条从s到t的一条边 使所有边的最大危险系数最小 InputThere will be at most 5 cases in the input file.T ...
- 【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市
本意是求最小瓶颈生成树,但是我们可以证明:最小生成树也是最小瓶颈生成树(其实我不会).数据范围很小,暴力kruscal即可. #include<cstdio> #include<al ...
- POJ 1861 ——Network——————【最小瓶颈生成树】
Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15268 Accepted: 5987 Specia ...
- 【bzoj2429】[HAOI2006]聪明的猴子(图论--最小瓶颈生成树 模版题)
题意:有M只猴子,他们的最大跳跃距离为Ai.树林中有N棵树露出了水面,给出了它们的坐标.问有多少只猴子能在这个地区露出水面的所有树冠上觅食. 解法:由于要尽量多的猴子能到达所有树冠,便用Kruskal ...
- UVA 11354 Bond(最小瓶颈路+倍增)
题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...
- CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】
F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- luogu p2330[SCOI05] 繁忙的都市——瓶颈生成树
P2330 05四川 繁忙的都市 题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道 ...
- 瓶颈生成树与最小生成树 POJ 2395 Out of Hay
百度百科:瓶颈生成树 瓶颈生成树 :无向图G的一颗瓶颈生成树是这样的一颗生成树,它最大的边权值在G的所有生成树中是最小的.瓶颈生成树的值为T中最大权值边的权. 无向图的最小生成树一定是瓶颈生成树,但瓶 ...
- POJ 2395 Out of Hay 草荒 (MST,Kruscal,最小瓶颈树)
题意:Bessie要从牧场1到达各大牧场去,他从不关心他要走多远,他只关心他的水袋够不够水,他可以在任意牧场补给水,问他走完各大牧场,最多的一次需要多少带多少单位的水? 思路:其实就是要让所带的水尽量 ...
随机推荐
- Linux下如何通过命令检查网卡是否插上网线
How To:Linux下如何通过命令检查网卡是否插上网线 主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上 ...
- paper:synthesizable finite state machine design techniques using the new systemverilog 3.0 enhancements 之 FSM Coding Goals
1.the fsm coding style should be easily modifiable to change state encoding and FSM styles. FSM 的的 状 ...
- PHPCompatibility检测php版本语法兼容
直接上步骤: cd /datas/htdocs/ mkdir PHPCompatibility cd PHPCompatibility/ curl -s http://getcomposer.org/ ...
- day 37 MySQL行(记录)的详细操作
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操 ...
- 最长公共子序列(LCS)问题
最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序 ...
- selenium2截图ScreenShot的使用
截图是做测试的基本技能,在有BUG的地方,截个图,保留失败的证据,也方便去重现BUG.所以,在自动化的过程中,也要能截图,也要能在我们想要截取的地方去截图,且能在错误产生时,自动的截图. 示例: 脚本 ...
- jsp页面上传多个name值到后台
平常利用表单提交的一般都是一个文本框对应一个name,而在后台都是利用request.getParameter(String name);这段代码返回的是一个String类型的参数:而当我们页面上有多 ...
- Java中对象方法的调用过程&动态绑定(Dynamic Binding)
Java面向对象的最重要的一个特点就是多态, 而多态当中涉及到了一个重要的机制是动态绑定(Dynamic binding). 之前只有一个大概的概念, 没有深入去了解动态绑定的机理, 直到很多公司都问 ...
- git 强制回到以前版本
git reset dfd3e36a641340a0b86f811df869c4375fabeff2 --hard
- AngularJS自定义指令directive:scope属性 (转载)
原文地址:http://blog.csdn.net/VitaLemon__/article/details/52213103 一.介绍: 在AngularJS中,除了内置指令如ng-click等,我们 ...