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支军队要向王都进军,并且消灭沿途经过的城市中的叛军。现给出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 20 3 0 03 41 22 32 4

Sample Output

3

//开始把有军队的城市都加入队列中,作为起始点,sum数组表示到这个城市累加消灭的叛军数,为了避免重复,遍历过后清0,d数组用来标记是否访问。直接用bfs解决。

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define maxn 100001
int a[maxn],b[maxn],d[maxn],sum[maxn];
int n,m;
vector<int>v[maxn];
void bfs()
{
    queue<int>q;  //不能定义成全局变量
    for(int i=0;i<maxn;i++)
        d[i]=9999999;
    memset(sum,0,sizeof(sum));
    for(int i=1;i<=m;i++)
    {
        q.push(b[i]);
        d[b[i]]=0;
    }
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=0;i<v[u].size();i++)
        {
            int x=v[u][i];
            if(d[x]>d[u]+1)
            {
                d[x]=d[u]+1;
                sum[x]+=sum[u]+a[x];
                sum[u]=0;
                q.push(x);
            }
        }
    }
}

int main()
{
    int x,y,ans;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<=n;i++)
            v[i].clear();
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=m;i++)
            scanf("%d",&b[i]);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        ans=0;
        bfs();
        for(int i=1;i<=n;i++)
        {
            ans+=sum[i];
        }
        printf("%d\n",ans);
    }
    return 0;
}

//别人的方法,省时很多。

/*从有军队的城市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;
}

FZU_Problem 2169 shadow

时间: 2024-11-05 22:48:13

FZU_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的军队.如

福州大学 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

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 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出来的对象.注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法.因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一

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

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)) 紫色的这

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

现在写几个自己比赛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的城市

FZU2169 shadow题解

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