首页 > 代码库 > 福州大学 Problem 2169 shadow
福州大学 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 */ |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。