日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LuoguP1268树的重量【构造/思维】By cellur925

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。