zoukankan      html  css  js  c++  java
  • 福州大学 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
    #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
    ",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
    */
    
  • 相关阅读:
    zeromq和czmq编译
    Future Pattern
    国外程序员是如何准备面试的
    附加数据库后,给所有者赋权
    利用FastCopy迁移应用数据
    持续集成之“Everything is code”
    利用SQLyog实现mysql自动备份
    LinkedIn已将可自定义的索引引擎IndexTank开源
    Hillstone安全网关相关问题收集
    Install Toad for Oracle 10.6 on Winows 7 X64
  • 原文地址:https://www.cnblogs.com/cancangood/p/3699698.html
Copyright © 2011-2022 走看看