| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 710 人关注过本帖
标题:各位,来看看吧,
只看楼主 加入收藏
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
结帖率:100%
收藏
已结贴  问题点数:70 回复次数:9 
各位,来看看吧,

有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?

输入格式


第一行包含一个整数 n 。

接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

接下来一共 n-1 行,每行描述树上的一条边。

输出格式

输出一个整数,代表选出的点的权值和的最大值。

样例输入

5
 1 2 3 4 5
 1 2
 1 3
 2 4
 2 5

样例输出

12

样例说明

选择3、4、5号点,权值和为 3+4+5 = 12 。

数据规模与约定


对于20%的数据, n <= 20。

对于50%的数据, n <= 1000。

对于100%的数据, n <= 100000。

权值均为不超过1000的正整数。

求详细点的解题算法,谢谢.
搜索更多相关主题的帖子: 正整数 最大值 规模 
2014-03-09 21:28
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
这是哪的题
2014-03-09 22:12
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 2楼 tlliqi
校内oj的练习题,

编写的程序,不能改变世界,却可以改变自己...
2014-03-09 22:42
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
看看..

[ 本帖最后由 Susake 于 2014-3-9 23:38 编辑 ]

仰望星空...........不忘初心!
2014-03-09 23:36
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
怎么没人来说呢。

编写的程序,不能改变世界,却可以改变自己...
2014-03-10 21:49
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:70 
这标题起的及容易被人忽略了

为了表述方便,我称“选出的点的权值和最大是多少”这个值为这棵树的最大值。用f(tree)来表示。

再设f0(tree)为树不包含根结点时的最大值,f1(tree)为树包含根结点时的最大值,v(node)为结点的权值,则

f0(tree) = sum(f(sub_tree))

f1(tree) = sum(f0(sub_tree)) + v(root)

f(tree) = max(f0(tree), f1(tree))

相比算法模型分析构造的难度,我倒觉得这题更有意义的地方在于如何构造这棵树。

下面是我的一个方案,时间复杂度O(N),空间复杂度S(N)。楼主顺道提交一下给我看看结果

程序代码:
#include <stdio.h>

#define LEN    100000

struct child_list;

typedef struct
{
    char f;
    int v0, v1;
    struct child_list * h;
}NODE;

typedef struct child_list
{
    NODE * p;
    struct child_list * next;
}CL;

NODE A[LEN];
CL   C[(LEN - 1) * 2];

int cal(NODE * r)
{
    NODE * np;
    CL * cp;

    r->f = 1;
    for(cp = r->h; cp; cp = cp->next)
    {
        if((np = cp->p)->f) continue;
        r->v0 += cal(np);
        r->v1 += np->v0;
    }
    return r->v0 > r->v1 ? r->v0 : r->v1;    
}

int main()
{
    int an, cn = 0, i, j, k;

    scanf("%d", &an);
    for(i = 0; i < an; scanf("%d", &A[i++].v1));
    for(i = 1; i < an; i++)
    {
        scanf("%d%d", &j, &k);
        j--; k--;
        C[cn].p = &A[j];
        C[cn].next = A[k].h;
        A[k].h = &C[cn++];
        C[cn].p = &A[k];
        C[cn].next = A[j].h;
        A[j].h = &C[cn++];
    }
    printf("%d", cal(A));
    return 0;
}

重剑无锋,大巧不工
2014-03-11 18:44
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 6楼 beyondyf
好吧,我上oj看看,还是beyondyf 版主好,看你的程序,学到很多东西,

编写的程序,不能改变世界,却可以改变自己...
2014-03-12 19:06
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 6楼 beyondyf
这是测评结果,全部数据通过,
评测点序号

评测结果

得分

CPU使用

内存使用

下载评测数据

1 正确 10.00 0ms 3.820MB VIP特权
 2 正确 10.00 0ms 3.820MB VIP特权
 3 正确 10.00 0ms 3.820MB VIP特权
 4 正确 10.00 0ms 3.839MB  
 5 正确 10.00 0ms 3.820MB  
 6 正确 10.00 109ms 3.820MB  
 7 正确 10.00 93ms 3.820MB  
 8 正确 10.00 93ms 7.355MB  
 9 正确 10.00 109ms 5.960MB  
 10 正确 10.00 109ms 7.875MB

编写的程序,不能改变世界,却可以改变自己...
2014-03-12 19:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
客气了。你上次给过我你的帐号和密码,再次为你对我的信任表示感谢。感谢之余提醒一下该更改密码了,以后还是你把题目发上来讨论,需要的话代为提交代码就好了,避免留下什么安全隐患

重剑无锋,大巧不工
2014-03-13 13:13
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 9楼 beyondyf
嗯,谢谢版主啦,你是个顶尖的知识分子,有什么会不信任呢,

编写的程序,不能改变世界,却可以改变自己...
2014-03-14 19:22
快速回复:各位,来看看吧,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018723 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved