福州大学 Problem 2169 shadow

http://acm.fzu.edu.cn/problem.php?pid=2169

思路:建立一个邻接表,利用搜索中回溯把走过的路标记为1,然后把这些标记为1的值全部加起来。

Problem 2169
shadow

Accept: 97    Submit: 274
Time Limit: 1000 mSec    Memory Limit : 32768 KB


Problem Description

YL是shadow国的国王,shadow国有N个城市。为了节省开支,shadow国只有N-1条道路,这N-1条道路使得N个城市连通。某一年,shadow国发生了叛乱,叛军占领了多个城市,王都岌岌可危。王都为编号为1的城市,除了王都外有K个城市有YL的军队。现在这K支军队要向王都进军,并且消灭沿途经过的城市中的叛军。现给出N个城市的道路情况以及城市的叛军数量,问总共需要消灭多少叛军?


Input

第一行输入两个整数N,K,接下来输入N(1<=N<=100000)个整数Ai(0<=Ai<=10000),表示第i个城市的叛军数量。接下来输入K个大于等于1且小于等于N的整数,表示有军队的城市的编号。数据保证王都以及有军队的城市没有叛军。接下来输入N-1行,每行两个整数u、v,表示连接u和v的一条道路。每支军队只能沿着道路走,并且是其所在城市与王都之间的最短路线走。


Output

输出一行一个整数表示消灭的叛军数量。


Sample Input

4 2

0 3 0 0

3 4

1 2

2 3

2 4


Sample Output

3

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

#include<stdio.h>

#include<string.h>

int len,dp[100005],head[200005],vis[200005];

int val[200005];

struct
node

{

    int
now,next;

}tree[200000];

void
add(int
x,int y)

{

   tree[len].now=y;

   tree[len].next=head[x];

   head[x]=len++;

}

void
dfs(int
root,int
p)

{

    int
i,son;

      for(i=head[root];i!=-1;i=tree[i].next)

    {

          son=tree[i].now;

        if(son==p)

           continue;

         dfs(son,root);

          if(vis[son])

          {

             vis[root]=1;

          }

    }

}

int
main()

{

    int
n,k,i,x,y,sum,a;

    while(~scanf("%d%d",&n,&k))

    {

        sum=0;

      memset(dp,0,sizeof(dp));

    memset(head,-1,sizeof(head));

    memset(vis,0,sizeof(vis));

     len=0;

    for(i=1;i<=n;i++)

       scanf("%d",&val[i]);

     for(i=1;i<=k;i++)

        {

            scanf("%d",&a);

            vis[a]=1;

        }

     for(i=1;i<=n-1;i++)

         {

             scanf("%d%d",&x,&y);

             add(x,y);

             add(y,x);

         }

            //vis[1]=1;

            dfs(1,-1);

         for(i=1;i<=n;i++)

         {

             if(vis[i]==1)

                 sum+=val[i];

         }

         printf("%d\n",sum);

    }

      return
0;

}/*

9 3

0 3 0 50 5 1 1 6 45

2 5 6

1 2

2 3

2 4

1 5

5 6

5 7

7 8

7 9

*/

福州大学 Problem 2169 shadow,码迷,mamicode.com

时间: 2024-10-31 18:59:58

福州大学 Problem 2169 shadow的相关文章

Problem 2169 shadow

 Problem 2169 shadow Accept: 141    Submit: 421 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description YL是shadow国的国王,shadow国有N个城市. 为了节省开支,shadow国仅仅有N-1条道路,这N-1条道路使得N个城市连通.某一年,shadow国发生了叛乱,叛军占据了多个城市,王都岌岌可危. 王都为编号为1的城市,除了王都外有K个城市有YL的军队.如

FZU Problem 2169 shadow

http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在许多城市.除了王都外有K个城市有军队,这K支军队要向王都进军,并且消灭沿途经过的城市中的叛军.每支军队只能沿着道路走,并且是其所在城市与王都之间的最短路线走.问能够消灭多少叛军? 思路: 有两种方法. 注意到题目只有N-1条边.是一颗树. 我想到的是对编号为1的结点(也就是王都,作为跟结点)进行DFS,一直遍历到树叶为止.沿途若发现有军

FZU_Problem 2169 shadow

Problem 2169 shadow Accept: 173 Submit: 553 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description YL是shadow国的国王,shadow国有N个城市.为了节省开支,shadow国只有N-1条道路,这N-1条道路使得N个城市连通.某一年,shadow国发生了叛乱,叛军占领了多个城市,王都岌岌可危.王都为编号为1的城市,除了王都外有K个城市有YL的军队.现在这K支军队要向王都进

福州大学 Problem 2168 防守阵地 I

http://acm.fzu.edu.cn/problem.php?pid=2168 最重要的是 dp[k]=dp[k-1]-ans[k-1]+x[i]*m; ans[k-1]是m个数求和.  Problem 2168 防守阵地 I Accept: 14    Submit: 20 Time Limit: 3000 mSec    Memory Limit : 32768 KB Problem Description 部队中共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M

FZU 2169 shadow

题目链接:shadow 先粘代码,明天补充. #include<stdio.h> #include<vector> #include<string.h> #include<queue> #include<iostream> #include<algorithm> using namespace std; const int maxn=100015; const int inf=0x7fffffff; int father[maxn];

FZU 2169 shadow (用了一次邻接表存边,树形DP)

Java 内存分配 Java程序运行过程会涉及以下内存区域: 1.寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制. 2.栈:保存局部变量的值,包括:1.用来保存基本数据类型的值:2.保存类的实例,即堆区对象的引用(指针).也可以用来保存加载方法时的帧. 3.堆:用来存放动态产生的数据,比如new出来的对象.注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法.因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一

福州大学第十一届程序设计

现在写几个自己比赛RE到死的题目,吸取教训:  Problem 2169 shadow Accept: 109    Submit: 322Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description YL是shadow国的国王,shadow国有N个城市.为了节省开支,shadow国只有N-1条道路,这N-1条道路使得N个城市连通.某一年,shadow国发生了叛乱,叛军占领了多个城市,王都岌岌可危.王都为编号为1的城市

福州大学第十一届程序设计竞赛

Problem 2167 大王叫我来巡山呐 Problem 2168 防守阵地 I 直接前缀和预处理 Problem 2169 shadow  .. Problem 2170 花生的序列 dp Problem 2171 防守阵地 II 线段树搞搞 Problem 2172 巡了南山我巡北山 http://blog.csdn.net/my_acm_dream/article/details/44507371 好题 Problem 2173 Nostop 矩阵高速幂 Problem 2174 卷福的

iOS MapKit导航及地理转码辅助类

Problem 2167 大王叫我来巡山呐 做的的第二题 呵呵 Problem 2168 防守阵地 I 做的第一题 打了下草稿 马上切了它 假设当前x=(ai)*1+(ai+1)*2+(ai+2)*3+''''+(aj)*m 下一次是(ai+1)*1+(ai+2)*2+(ai+3)*3+''''+(aj+1)*m = (ai)*1+(ai+1)*2+(ai+2)*3+''''+(aj)*m+(aj+1)*(m+1) -(ai+(ai+1)+(ai+2)+'''+(aj)+(aj+1)) 紫色的这