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];

struct Edge
{
    int to;
    int net;
} edge[maxn<<1];

int head[maxn],tot;
bool vis[maxn]; //spfa算法中 该点是否已经入队列
int dist[maxn]; // 源点到每个点的最短距离
int n; // 点的个数
int num[maxn]; // 每个地方的叛军数量
int point[maxn]; // YL军队所在城市
bool flag[maxn]; //叛军是否已经被消灭

void addedge(int u,int v)
{
    edge[tot].to=v;
    edge[tot].net=head[u];
    head[u]=tot++;
}

void spfa(int start)
{
    for(int i=0; i<=n; i++)
    {
        vis[i]=false;
        dist[i]=inf;
    }
    vis[start]=true;
    dist[start]=0;
    queue<int >que;

    que.push(start);
    while(!que.empty())
    {
        int u=que.front();
        que.pop();
        vis[u]=false;
        for(int i=head[u]; i!=-1; i=edge[i].net)
        {
            int v=edge[i].to;
            if(dist[v]>dist[u]+1)
            {
                dist[v]=dist[u]+1;
                if(!vis[v])
                {
                    father[v]=u;
                    vis[v]=true;
                    que.push(v);

                }
            }
        }

    }
}

int main()
{
    int k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        for(int i=0; i<=n; i++)
        {
            father[i]=-1;
            flag[i]=false;
            head[i]=-1;
        }
        tot=0;
        for(int i=1; i<=n; i++)
            scanf("%d",&num[i]);

        for(int i=0; i<k; i++)
            scanf("%d",&point[i]);

        int u,v;
        for(int i=1; i<n; i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }

        int ans=0;
        spfa(1);

        for(int i=0; i<k; i++)
        {
            int root=point[i];
            while(father[root]!=-1)
            {
                root=father[root];
                if(flag[root])
                    break;
                ans+=num[root];
                flag[root]=true;
            }

        }
        printf("%d\n",ans);
    }
    return 0;
}

  

时间: 2024-10-21 12:17:46

FZU 2169 shadow的相关文章

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

Java 内存分配 Java程序运行过程会涉及以下内存区域: 1.寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制. 2.栈:保存局部变量的值,包括:1.用来保存基本数据类型的值:2.保存类的实例,即堆区对象的引用(指针).也可以用来保存加载方法时的帧. 3.堆:用来存放动态产生的数据,比如new出来的对象.注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法.因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一

FZU Problem 2169 shadow

http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在许多城市.除了王都外有K个城市有军队,这K支军队要向王都进军,并且消灭沿途经过的城市中的叛军.每支军队只能沿着道路走,并且是其所在城市与王都之间的最短路线走.问能够消灭多少叛军? 思路: 有两种方法. 注意到题目只有N-1条边.是一颗树. 我想到的是对编号为1的结点(也就是王都,作为跟结点)进行DFS,一直遍历到树叶为止.沿途若发现有军

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

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支军队要向王都进

2014 Super Training #10 C Shadow --SPFA/随便搞

原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边,用向量表示的话会TLE,而且用SPFA有一个异或,就是题目说要沿最短路走到都城,但是SPFA是走最短路去消灭叛军,然后再走回都城,我不知道怎么回事,不知道能不能有大神解释.因为这样的话,有多少叛军就能消灭多少叛军了,那就不要用什么算法 了,直接一个统计.于是试了一下,居然A了,瞬间变成大水题,我无法

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

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的城市