luogu 1268 树的重量

打眼一看就是最小生成树嘛,但经过板子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

 

以上

 

posted @ 2018-07-26 10:24  ASDIC减除  阅读(96)  评论(0编辑  收藏  举报