题目描述:

  这是道题题意有点迷(或者是我语文不好),但其实实际上求的就是图中连通块的个数,然后在连通块与连通块之间连边建图跑最小生成树。但是……这个图可能是不连通的……求桥的数量和总长

  于是我立刻想到了一种解法:分别在建好的图中的每一个连通块中跑最小生成树,如果当前连通块已经跑完了就跳转到下一个连通块。

  关键代码:

for i:= to n do
d[i]:=a[,i];
d[]:=; sum:=; ans:=;//d[i]表示第i个点到生成树的距离,sum是桥的数量,ans是桥的总长度
repeat
k:=maxlongint; p:=;
for i:= to n do
if(d[i]<k)and(d[i]>)then begin
k:=d[i]; p:=i;
end;
if p= then begin\\跳转到下一个连通块
i:=;
while(d[i]=)and(i<=n)do inc(i);
if i>n then break
else begin
d[i]:=;
for j:= to n do
if(d[j]>)and(d[j]>a[i,j])then d[j]:=a[i,j];
continue;
end;
end;
ans:=ans+d[p]; inc(sum); d[p]:=;
for i:= to n do
if d[i]>a[p,i] then d[i]:=a[p,i];
until false;
writeln(sum,' ',ans);\\输出答案

  然后我去看了看题解,发现了另外一种简单得多的方法:建假枝

  在数据中,可能有多个建筑物,但是只要另外建一个点,将它与代表每个建筑物的点连起来(假枝),这样图就会变连通,在统计时,只要忽略假枝就能得出正确的解。

  关键代码:

  for i:= to sum do begin\\建假枝
a[i,sum+]:=<<;
a[sum+,i]:=<<;
end;
writeln(sum); n:=sum+;
for i:= to n do
d[i]:=a[,i];
d[]:=; sum:=; ans:=;
repeat
k:=maxlongint; p:=;
for i:= to n do
if(d[i]<k)and(d[i]>)then begin
k:=d[i]; p:=i;
end;
if p= then break;
if d[p]<<< then begin\\判断是否为假枝
ans:=ans+d[p]; inc(sum);
end;
d[p]:=;
for i:= to n do
if d[i]>a[p,i] then d[i]:=a[p,i];
until false;
writeln(sum,' ',ans);

最新文章

  1. MIT 6.828 JOS学习笔记16. Lab 2.2
  2. 微信小程序之小豆瓣图书
  3. 记录思想分享知识编辑器 Markdown 编辑阅读器
  4. margin 碰到过的重叠问题
  5. Javascript隐式转换
  6. HTML5拖拽实例
  7. mfs-管理员
  8. PHP闭包(Closure)初探
  9. codeforces 630D Hexagons!
  10. Collections.shuffle源码阅读
  11. CentOS 7解决Local Time与实际时间相差8小时问题
  12. Java并发编程总结4——ConcurrentHashMap在jdk1.8中的改进(转)
  13. GPU编程--kernels(2)
  14. MFC界面相关源码
  15. 【LeetCode每天一题】Add Binary(二进制加法)
  16. 模拟PLC 的圆弧插补方式在VC中绘制圆弧
  17. SQL优化工具SQLAdvisor使用
  18. 自定义admin(self_admin)
  19. mongodb分片balance
  20. JAVA 没有重载运算符,那么 String 类型的加法是怎么实现的,以及String类型不可变的原因和好处

热门文章

  1. POJ 1848 Tree
  2. jpofiler监控JVM
  3. NOIP2011提高组(选择客栈)
  4. docker学习笔记(2) 构建镜像
  5. getParameterMap的使用
  6. 20160924-1——mysql存储引擎
  7. redis 集群安装 3主3从3台云主机
  8. es 中 for in for of
  9. 使用远程管理工具Xshell
  10. SQL2008 R2直接恢复 mdf后缀数据文件