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
    */
    
  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/cancangood/p/3699698.html
Copyright © 2011-2022 走看看