• 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的军队。如今这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 ",ans);
        }
        return 0;
    }

  • 相关阅读:
    IHttpHandler做文件防盗链接
    使用SQL的全文搜索功能构建 Web 搜索应用程序
    Google 二维条码 API
    Flash Media Server 入门教程
    Janus WinForms Controls Suite v2.0.1000
    如何将数据大容量加载到合并发布中的表(复制 TransactSQL 编程)
    转:CentOS 5.4下的Memcache安装
    转:用php读取xml数据
    HPUX启动和关闭
    目录,文件操作详谈—php
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5182117.html
Copyright © 2020-2023  润新知