您的位置:首页 > 其它

JZOJ 4740 【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划

2016-09-09 19:30 316 查看

Zjr506的捕猫计划

题目大意

给出有n个点,m条边的一个图,现在要删掉一些边,使得该图内没有环,问实现目标的最小代价。(代价即为删掉的边的总长度)

数据范围

N<=10000,M<=50000

题解

这题嘛,其实挺简单的,正着删边做较困难,那就正难则反,倒着做,让保留的边的总长度最大,那自然代价就最小。

然后跑一边最大生成树,求出最大保留总长度K。

则答案就为所有边的长度-K。

Code(Pascal)

var
w:array[0..60000,1..2] of extended;
bj:array[0..60000,1..2] of longint;
len:array[0..60000] of extended;
fa:array[0..12000] of longint;
n,m,j,k,l,i,o,p:Longint;
ans:extended;
function distance(x,y:longint):extended;
begin
exit(sqrt(sqr(w[x,1]-w[y,1])+sqr(w[x,2]-w[y,2])));
end;
procedure sjzl;
var
i,k:longint;
begin
randomize;
for i:=1 to n div 2 do
begin
k:=random(n div 2)+1+n div 2;
bj[0]:=bj[i];
bj[i]:=bj[k];
bj[k]:=bj[0];
len[0]:=len[i];
len[i]:=len[k];
len[k]:=len[0];
end;
end;
procedure qsort(l,r:longint);
var
i,j:longint;
m:extended;
begin
i:=l;
j:=r;
m:=len[(l+r) div 2];
repeat
while len[i]>m do inc(i);
while len[j]<m do dec(j);
if i<=j then
begin
bj[0]:=bj[i];
bj[i]:=bj[j];
bj[j]:=bj[0];
len[0]:=len[i];
len[i]:=len[j];
len[j]:=len[0];
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
function find(o:longint):longint;
begin
if fa[o]=o then exit(o);
fa[o]:=find(fa[o]);
exit(fa[o]);
end;
begin
readln(n,m);
for i:=1 to n do
readln(w[i,1],w[i,2]);
for i:=1 to m do
begin
readln(bj[i,1],bj[i,2]);
len[i]:=distance(bj[i,1],bj[i,2]);
end;
for i:=1 to 6 do
sjzl;
qsort(1,m);
for i:=1 to n do
fa[i]:=i;
for i:=1 to m  do
if find(bj[i,1])<>find(bj[i,2]) then
begin
fa[fa[bj[i,2]]]:=fa[bj[i,1]];
len[i]:=0;
end;
ans:=0;
for i:=1 to m do
ans:=ans+len[i];
writeln(ans:0:9);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: