博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树的重量
阅读量:4332 次
发布时间:2019-06-06

本文共 1047 字,大约阅读时间需要 3 分钟。

太巧妙了。。。

推荐大佬的

\(n=2\)时,答案就是\(dis[1][2]\)

那么答案大于2时呢?

enter image description here

考虑3号点,因为1,和2号点的路径已经统计到答案里去了,3号点对答案产生的贡献只有蓝色部分的路径长度。那怎么求呢?考虑弗洛伊德求最短路的方法,借助中间点更新(这里不太一样啊\(hhh\))。3号点一定在1号和2号节点路径的分支上,那么\(dis[1][3]+dis[2][3]-dis[1][2]\)就等于蓝色部分路径长度的两倍。

接下来考虑4号点,由于我们现在不知道它是从于1号点相连的那个点的分支连出来的,所以需要枚举一下。假如枚举出一个点不是我们所要求的点。如图,4号点是从1号点到3号点的路径中连出来的分支(这里说的分支是指最小的一个,因为其他的一定已经加进答案里去了)。如果我们当前枚举到了2号点,那么求出来的答案会是橙色路径的长度,但我们实际要求的其实是红色路径的长度。考虑这两条路径的区别,发现橙色的路径比红色的路径长!所以我们枚举的时候取最小的一个就行了。
至此,此题完美解决。

#include
#include
#include
using namespace std;const int N = 35;int n,ans,len,dis[N][N];int main(){ scanf("%d",&n); while(n!=0) { ans=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) scanf("%d",&dis[i][j]); ans=dis[1][2]; for(int i=3;i<=n;i++) { len=1054612165; for(int j=2;j
>1); } ans+=len; } printf("%d\n",ans); scanf("%d",&n); } return 0;}

转载于:https://www.cnblogs.com/karryW/p/11416006.html

你可能感兴趣的文章
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
机器学习降维之主成分分析
查看>>
CTP2交易所成交回报
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>