zzuli---1907---

题目链接:http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1907

Description

  进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通。

  每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关。如果小火山取走了这个房间的宝藏,那么这个房间通往其他房间的门就永远打不开了,也就是说后面的宝藏小火山是得不到了(进入这个房间的门是不会关闭的,小火山还是可以回去的);如果小火山不取这个宝藏,而是去打开通往另一房间的门,那么这个房间的宝藏就会消失, 小火山就得不到这个房间的宝藏。

  不过,小火山已经有了藏宝图,知道每一个房间的宝藏的价值,现在想请你帮小火山算一下,他最多能获得多少钱去买股票?

Input

输入第一行是一个整数T(T <= 50), 表示一共有T组数据。

对于每一组数据,第一行是两个数N, S(1 <= N <= 10000, 1 <= S <= N), N代表有N个房间, S代表小火山进去宝藏后的

起始房间(小火山怎么进入起始房间不重要),第二行是N个数,代表每个房间宝藏的价值, 随后N-1行, 每行两个数A, B, 代表

A, B这两个房间联通。

Output

对于每一组数据输出一个整数, 代表小火山能获得的最大钱数。

Sample Input

21 1
20
3 1
4 5 6
1 2
2 3 

Sample Output
20
6
HINT
Source

zzuli

analyse:

进入一个房间后有两种选择:

1>拿走此房间宝藏,后面的不要了;

2>此房间宝藏放弃,拿走与此房间相连的所有其他房间的宝藏;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;
typedef long long LL;

const int maxn=50009;
const int INF=0x3f3f3f3f;
const int mod=2009;

int head[maxn];
int value[maxn];
int vis[maxn];
int n, k;

struct node
{
    int v, next;
} maps[maxn<<2];

void Add(int u, int v)
{
    maps[k].v=v;
    maps[k].next=head[u];
    head[u]=k++;
}

int DFS(int s)
{
    int sum=0;
    for(int i=head[s]; i!=-1; i=maps[i].next)
    {
        int v=maps[i].v;
        if(!vis[v])
        {
            vis[v]=1;
            sum+=DFS(v);
        }
    }
    return max(sum, value[s]);
}
int main()
{
    int T, s;
    scanf("%d", &T);

    while(T--)
    {
        scanf("%d %d", &n, &s);
        for(int i=1; i<=n; i++)
            scanf("%d", &value[i]);

        memset(head, -1, sizeof(head));
        k=0;
        for(int i=1; i<n; i++)
        {
            int a, b;
            scanf("%d %d", &a, &b);
            Add(a, b);
            Add(b, a);
        }

        memset(vis, 0, sizeof(vis));
        vis[s]=1;
        int ans=DFS(s);
        printf("%d\n", max(ans, value[s]));
    }
    return 0;
}
时间: 2024-10-12 14:46:45

zzuli---1907---的相关文章

zzuli 1907: 小火山的宝藏收益

***题意:中文的 做法:邻接表+DFS,就相当于搜一棵树,比较一下当前结点得到的宝藏多还是子树下面得到的宝藏多,仔细想想就是水题*** #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<queue> #include<vector>

zzuli 1907: 小火山的宝藏收益 邻接表+DFS

Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 113  Solved: 24 SubmitStatusWeb Board Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏,那么这个房间通往其他房间的门就永远打不开了,也就是说后面的宝藏小火山是得不到了(进入这个房间的门是不会关闭的,小火山还是可以回去的

(zzuli)1907 小火山的宝藏收益

Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏,那么这个房间通往其他房间的门就永远打不开了,也就是说后面的宝藏小火山是得不到了(进入这个房间的门是不会关闭的,小火山还是可以回去的):如果小火山不取这个宝藏,而是去打开通往另一房间的门,那么这个房间的宝藏就会消失, 小火山就得不到这个房间的宝藏. 不过,小火山已经有了藏宝图,知道每一个房间的宝藏的价

zzuli oj 1134 字符串转换

题目链接: https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1134 Description 输入一个以回车结束的字符串,它由数字和字母组成,请过滤掉所有非数字字符,然后将数字字符串转换成十进制整数后乘以2输出. Input 输入一个以回车结束的字符串,长度不超过100,由数字和字母组成. Output 将转换后的整数乘以2输出,测试数据保证结果在int范围内. Sample Input sg987aa65t498 Sample Output 1

HDU 1907 Nim博弈变形

1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形.设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,设状态S0:a1^a2^..an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败).S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜).T0:a1

URAL 1907. Coffee and Buns(数论推导+容斥原理)

1907. Coffee and Buns Time limit: 1.0 second Memory limit: 64 MB Planet Ataraxia is known for its education centers. The people who are expected to take high social positions in future are brought up in conditions of continuous training and supervisi

线段树区间覆盖 蛤玮打扫教室(zzuli 1877)

http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877 Description 现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每个签上写着两个数L,R(L<=R),抽到的人要把[L,R]的教室全部打扫一遍.由于蛤玮是队长而且他很懒,他通过某种交易提前知道了所有m个签上面写的是什么,而且通过某种魔法可以控制自己抽到哪个签.一个教室被打扫一次就干净了,所以蛤玮想知道自己抽哪些签可以不用打扫教室而且不会被教练发现,即他抽到的区间全都会

ural 1907 Coffee and Buns

1907. Coffee and Buns Time limit: 1.0 secondMemory limit: 64 MB Planet Ataraxia is known for its education centers. The people who are expected to take high social positions in future are brought up in conditions of continuous training and supervisio

hdu 1907 John

取火柴的游戏 题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法. 若sum=0:则先取者输,后取者胜: 若sum=!0,则先取者使其变成奇异状态,先取者胜 即谁先面临奇异状态谁输: 题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法. 分为2种情况:1:每个堆数的火柴数量为1,若为奇数堆,先取者最后取完,则输: 若为偶数堆,后取则输 2

zzuli训练赛_05_13-K

题意: 是输入N,2<=N<=100000,求N的质因子个数. 样例输入12 5 30 样例输出2 1 3 提示 12 = 2 * 2 * 3 5 = 5 30 = 2 * 3 * 5 解题思路: 就写个判断质数的函数,循环判断就可以,不过不是质数就加,是不同的质数. 具体代码: #include<iostream> #include<cmath> #include<cstring> using namespace std; bool temp[100000