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的军队。如今这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

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

/*从有军队的城市BFS遍历,找到王都。沿途累加被杀掉的叛军数

用两个数组存储邻边关系

*/

#include<cstdio>

#include<cstring>

#include<queue>

using namespace std;

#define N 100005

struct list

{

    int val;

    int nxt;

}L[N*2]; //存储相临边的关系

struct point

{

  int val;

  int k_num;  //杀死敌军数

}p,q;

int enemy[N]; //叛军

int army[N];  //国军

int vis[N];   //标记是否訪问

int head[N];

int n,k,id;

void add(int u,int v) //把u连在v后面

{

    L[id].val=v;  //保存v的值,且拥有唯一id

    L[id].nxt=head[u]; //// v的next为head[u],这里head[u]表示u的头结点的id,且把它连在v的后面

    head[u]=id++;// 此时由于u的头结点已经连在v后面了,所以要更新头结点,把head[u]换成v的id

}

int bfs(int x)

{

    int ret=0;

    queue<point>s;

    p.val=x;

    p.k_num=enemy[x];

    s.push(p);

    vis[x]=1;

    while(!s.empty())

    {

        p=s.front();

        s.pop();

        if(1==p.val)   //找到目标点

            ret=p.k_num;

        for(int i=head[p.val];i!=0;i=L[i].nxt)

        {

            int v=L[i].val;

            if(0==vis[v])

            {

                vis[v]=1;

                q.val=v;

                q.k_num=p.k_num+enemy[v];

                s.push(q);

            }

        }

    }

    return ret;

}

int main()

{

    while(scanf("%d%d",&n,&k)!=EOF)

    {

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

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

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

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

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

        memset(head,0,sizeof(head));

        int ans=0;

        id=1;

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

        {

            int u,v;

            scanf("%d%d",&u,&v);

            add(u,v);

            add(v,u);

        }

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

        {

            if(0==vis[army[i]])

                ans+=bfs(army[i]);

        }

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

    }

    return 0;

}

Problem 2169 shadow的更多相关文章

  1. 福州大学 Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 思路:建立一个邻接表,利用搜索中回溯把走过的路标记为1,然后把这些标记为1的值全部加起来. Problem 216 ...

  2. FZU Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在很多城市.除了王都外有K个城市有军队, ...

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

    Accept: 28 Submit: 97 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description YL是shadow国的国 ...

  4. FZU 2169 shadow spfa

    题目链接:shadow 好佩服自己耶~~~好厉害~~~ 麻麻再也不用担心我的spfa 和 邻接表技能了~~~ spfa 记录最短路径. #include <stdio.h> #includ ...

  5. FZU 2092 收集水晶(记忆化搜索)

    Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...

  6. FZU2169 shadow题解

    http://acm.fzu.edu.cn/problem.php?pid=2169 Problem Description YL 是shadow国的国王,shadow国有N个城市.为了节省开支,sh ...

  7. Tutorial - Deferred Rendering Shadow Mapping 转

    http://www.codinglabs.net/tutorial_opengl_deferred_rendering_shadow_mapping.aspx Tutorial - Deferred ...

  8. Linear or non-linear shadow maps?

    Quote: Original post by RobMaddisonI understand that, for aliasing mitigation, it might be beneficia ...

  9. 2014 Super Training #10 C Shadow --SPFA/随便搞/DFS

    原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边, ...

随机推荐

  1. Unity3d 通过协程来实现文件的全部加载后执行

    相信大家会经常遇到在游戏中需要WWW从本地或者服务器上获取数据,而我们通常容易会犯下面这种个错误:当数据较少或者网速较好时程序运行正常.而当数据较大或者网速不好时程序会出错误.比如卡住. 所以我们要使 ...

  2. jQuery学习之结构解析

    jQuery内核解析 1.jQuery整体的结构是一个匿名函数 (function( window, undefined ) {})(window); 2.jQuery就是一个很普通的函数,也是一个很 ...

  3. html 浮动元素

    在CSS布局中分为内联元素(display:inline)和块状元素(display:block),块状元素默认会占据一行,可设置高度宽度以及边距,而内联元素不会也不能设置.常见的内联元素有:a.sp ...

  4. Python学习之路——初识Python

    一.第一个程序Hello World: 1.打印输出Hello World: Python2打印方法: >>> print "hello world"hello ...

  5. 13-C语言字符串函数库

    目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...

  6. win使用telnet到ubuntu下vim显示中文为乱码的解决方法~

    1.几个路径: ubuntu: /etc/default/locale  相当于 centos:/etc/sysconfig/i18n vimrc的路径:① ~/.vimrc    ② /etc/vi ...

  7. ASP.NET jQuery 随笔 使用jQuery UI的Autocomplete方法实现文本框的自动搜索填充功能

    首先当然是去下载JQuery UI ,这里这里是下载地址http://jqueryui.com/ 第一步是点击这里 第二步选择你想要下载的主题进行下载 我这里是选择的cupertino主题包 点击圆圈 ...

  8. ImageMagick还是GraphicsMagick?

    引自:http://co63oc.blog.51cto.com/904636/328997 ImageMagick(IM) 套装包含的命令行图形工具是一主要自由软件:Linux,其他类Unix操作系统 ...

  9. kinect for windows - DepthBasics-D2D详解之三

    这篇文章我们将总结一下,之前两篇文章中提到的Kinect SDK的函数接. 函数接口: NuiGetSensorCount: 获取连接的Kinect设备个数 原型:_Check_return_ HRE ...

  10. 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找

    用三种方法实现对一个数组的排序,并设计一个函数实现数的查找,要求时间越短越好,空间占用越少越好. 对数组排序的方法很多,我们选比较常用和容易的三种排序,直接插入排序,冒泡排序和快速排序. 直接插入排序 ...