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


    Accept: 28 Submit: 97
    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<malloc.h>
    typedef struct nnn
    {
        int id;
        struct nnn *next;
    }*NODE,node;
    NODE edg[200005];
    int dp[200005],flog[200005],value[200005],vist[200005];
    void dfs(int p)
    {
        NODE NEXT,q;
        dp[p]=value[p]; vist[p]=1;
        for(NEXT=edg[p]->next; NEXT!=NULL; )
        {
            int son=NEXT->id;
            if(vist[son]){
              NEXT=NEXT->next;  continue;
            }
            dfs(son);
            if(flog[son])
            {
                flog[p]=1; dp[p]+=dp[son];
            }
            q=NEXT;
            NEXT=NEXT->next;
        }
    }
    int main()
    {
        int n,k,a,b,i;
        NODE p;
        while(scanf("%d%d",&n,&k)>0)
        {
            for(i=0;i<=n;i++)
            {
                flog[i]=0; vist[i]=0;
                edg[i]=(NODE)malloc(sizeof(node));
                edg[i]->next=NULL;
            }
            for(i=1; i<=n; i++)
                scanf("%d",&value[i]);
            for(i=1; i<=k; i++)
            {
                scanf("%d",&a);
                flog[a]=1;
            }
            for(i=1; i<n;i++)
            {
                scanf("%d%d",&a,&b);
                p=(NODE)malloc(sizeof(node));
                p->id=b; p->next=edg[a]->next;
                edg[a]->next=p;
                 p=(NODE)malloc(sizeof(node));
                p->id=a; p->next=edg[b]->next;
                edg[b]->next=p;
            }
            dfs(1);
            printf("%d
    ",dp[1]);
        }
    }
    


  • 相关阅读:
    Spring配置自动加载执行多次的解决方法
    获取Excel文件内容,0307通用
    将Json转实体
    将实体转换为map
    Json数据转Map
    获取随机字符串
    将长内容分割,用双主键进行存储
    解决win10开机出现C:WIndowssystem32configsystemprofileDesktop不可用 问题
    2016.2.22
    云中行走
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3801262.html
Copyright © 2020-2023  润新知