P1268-树的重量【图论】
生活随笔
收集整理的這篇文章主要介紹了
P1268-树的重量【图论】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
題目大意
一棵樹有nnn個(gè)葉子節(jié)點(diǎn),給出每兩個(gè)葉子節(jié)點(diǎn)之間的距離。求這棵樹的邊權(quán)之和。
解題思路
我們考慮每次加入一個(gè)節(jié)點(diǎn)。兩個(gè)節(jié)點(diǎn)時(shí)不用說。
加入第三個(gè)節(jié)點(diǎn)時(shí),肯定是加入在節(jié)點(diǎn)1和節(jié)點(diǎn)2之間。
之后我們開始推導(dǎo):當(dāng)我們加入節(jié)點(diǎn)nnn時(shí),我們可以考慮加入在1~x(x∈[2..n?1])1\sim x(x\in [2..n-1])1~x(x∈[2..n?1])之間。
為什么一定是從1開始,我們考慮是否有可能加入在x~yx\sim yx~y的路徑直接,其實(shí)沒有必要,因?yàn)槿绻尤朐谶@兩個(gè)點(diǎn)之間,那么考慮加入到1~x1\sim x1~x和1~y1\sim y1~y的結(jié)果是一樣的。所以之間起點(diǎn)定義為111就好了。
codecodecode
#include<cstdio> #include<algorithm> using namespace std; int n,a[50][50],ans; int main() {while(1){scanf("%d",&n);if(!n) break;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)scanf("%d",&a[i][j]),a[j][i]=a[i][j];ans=a[1][2];for(int i=3;i<=n;i++){int len=2147483647;for(int j=2;j<i;j++)len=min(len,(a[1][i]+a[j][i]-a[1][j])/2);ans+=len;}printf("%d\n",ans);} }總結(jié)
以上是生活随笔為你收集整理的P1268-树的重量【图论】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零跑全新车型 C16 实车亮相:预计定位
- 下一篇: P3385-[模板]负环【SPFA】