LuoguP1268树的重量【构造/思维】By cellur925
生活随笔
收集整理的這篇文章主要介紹了
LuoguP1268树的重量【构造/思维】By cellur925
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目傳送門
Description
給你一個矩陣$M$,$M(i,j)$表示$i$到$j$的最短距離。定義樹的重量為樹上各邊權之和,對于任意給出的合法矩陣$M$,已知它所能表示樹的重量是唯一確定的。給出一個矩陣,求它所表示的樹的重量。
Sol
這道題我想了一會發現什么思路都沒有...然后企圖畫一點圖也無濟于事...
后來看題解發現我們其實可以從簡單的角度入手,逐漸發現規律。
當有兩個點的時候,顯然答案就是$g(1,2)$。
當有三個點的時候,如圖,發生了分叉。(因為各點都是葉子節點)
(圖片引用自?@TsReaper)
設藍線部分為$len$,那么樹的重量就是$g(1,2)$+$len$。那么$len$部分怎么求?稍微想想可以得出$len=g(1,3)+g(2,3)-g(1,2)$再除以2。
類比一下,當有四個...五個...六個...點的時候,也會在某一個路徑上發生分叉,而一個點只可能從在它編號之前的點分叉而來。于是我們對于每個點,枚舉一下它是從它之前哪個點分叉過來的,取個最小值累加即可得到答案。
Code
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 7 int n,ans; 8 int f[50][50]; 9 10 int main() 11 { 12 while(scanf("%d",&n)!=EOF&&n) 13 { 14 for(int i=1;i<=n-1;i++) 15 for(int j=i+1;j<=n;j++) 16 scanf("%d",&f[i][j]),f[j][i]=f[i][j]; 17 ans+=f[1][2]; 18 for(int i=3;i<=n;i++) 19 { 20 int tmp=0x3f3f3f3f; 21 for(int j=2;j<=i-1;j++) 22 tmp=min(tmp,(f[1][i]-f[1][j]+f[i][j])>>1); 23 ans+=tmp; 24 } 25 printf("%d\n",ans); 26 ans=0; 27 memset(f,0,sizeof(f)); 28 } 29 return 0; 30 } View Code?
轉載于:https://www.cnblogs.com/nopartyfoucaodong/p/9781581.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的LuoguP1268树的重量【构造/思维】By cellur925的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台电平板电脑a11四核固件(台电a10双
- 下一篇: 五、Kafka 用户日志上报实时统计之应