1. 程式人生 > >洛谷1268 樹的重量

洛谷1268 樹的重量

無奈 isp close pan 多余 最小 aps org .org

打眼一看就是最小生成樹嘛,但經過板子wa掉的經歷後得知,,emmmm,原來是,

構造!

(雖然不知是什麽但覺得聽起來很厲害的樣子...手動微笑)

n=2的情況 自然就是g(1,2)

n=3的情況,由於所有點均為葉子節點,運用樹的性質,藍線部分的 len=(g(1,3)+g(2,3)-g(1,2)) / 2

技術分享圖片

n>3的情況也同理,枚舉i看點n是不是從1~i的路徑上分叉出來的,求出最小的len加入答案即可

技術分享圖片

若認為點4是從1~2的路徑上分叉出來的,答案就會加上紅色部分長度。但是紅色部分長度有一部分多余,只有點4是從1~3路徑上分叉出來的,才能加上正確答案(藍色部分)

(洛谷的水印似乎暴露了些什麽,消不掉我也很無奈....)

構造好題

技術分享圖片
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
const int maxn=30;
const int INF=(1<<30);
int d[maxn][maxn];
int main()
{
    int n;
    while(scanf("%d",&n)==1&&n)
    {
        for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            scanf(
"%d",&d[i][j]),d[j][i]=d[i][j]; int ans=d[1][2]; for(int i=3;i<=n;i++){ int t=INF; for(int j=2;j<i;j++) t=min(t,(d[1][i]+d[j][i]-d[1][j])/2); ans+=t; } printf("%d\n",ans); } return 0; }
View Code

以上

洛谷1268 樹的重量