luogu P1268 树的重量

一开始把这题想复杂了,,,

这里记di[i][j]表示ij的距离

首先如果n=2,答案显然为di[1][2]

如果n=3

233

懒得画图了盗图过来

那么3号点会从1,2号点的路径上伸出去,相比较n=2,答案多出了di[1][3]+di[2][3]di[1][2]2

n=4的情况

233

如果把4看做从1,2号点路径上伸出去的,那么答案(红色部分)会算重一部分;把4看做从1,3号点路径上伸出去的,那么答案(蓝色部分色部分)则是正确的,同时我们也发现蓝色比红色短

以此类推,每次插入一个点i,把它依次看做从1,j(1<j<i)号点路径上伸出去的,然后答案加上min(di[1][i]+di[j][i]di[1][j]2).取min才不会和前面的答案算重

其实我一开始考虑记录每条路径上哪个位置伸出去什么点,麻烦的死

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register

using namespace std;
const int N=1000000+10;
il LL rd()
{
    re LL x=0,w=1;re char ch;
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
int n,di[40][40];

int main()
{
  while(1)
    {
      n=rd();
      if(n==0) break;
      for(int i=1;i<=n;i++) di[i][i]=233;
      for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
	  	di[i][j]=di[j][i]=rd();
      int ans=di[1][2];
      for(int i=3;i<=n;i++)
	    {
	      int an=233;
	      for(int j=2;j<i;j++) an=min(an,(di[1][i]+di[i][j]-di[1][j])>>1);
	      ans+=an;
	    }
      printf("%d\n",ans);
    }
  return 0;
}
posted @   ✡smy✡  阅读(114)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示