题目链接:shadow

好佩服自己耶~~~好厉害~~~

麻麻再也不用担心我的spfa 和 邻接表技能了~~~

spfa 记录最短路径。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#define maxn 100010
#define inf 1000000000
using namespace std; int n, k;
int num[maxn];
int army[maxn]; struct Node {
int v;
int nxt;
}edge[maxn]; // 对于edge[i]这条边,(u-----v)只保存v和上一条以u为起点的边的序号。u的信息保存在最后一条以u为起点的边上。 bool visQue[maxn]; //顶点是否已经入队列
int cnt[maxn]; // 顶点入队列的次数
int dis[maxn]; // 保存源点到每个点的最短距离 int head[maxn];
int tot;
bool visArmy[maxn]; // 判断叛军是否已经被消灭
int fa[maxn]; // 最短路过程中记录每个节点的前驱 void addEdge(int u, int v) {
edge[tot].v = v;
edge[tot].nxt = head[u];
head[u] = tot++;
} bool spfa(int sou) {
{ // 初始化
memset(visQue, 0, sizeof(visQue));
memset(cnt, 0, sizeof(cnt));
for (int i=0; i<maxn; ++i) {
dis[i] = inf;
}
} dis[sou] = 0;
queue<int>que;
que.push(sou);
visQue[sou] = 1;
cnt[sou]++; while(!que.empty()) {
int u = que.front();
que.pop();
visQue[u] = 0;
for (int i=u; i!=-1; i=edge[i].nxt) {
int v = edge[i].v;
if (dis[v] > dis[u] + 1) {
dis[v] = dis[u] + 1;
fa[v] = u;
if (!visQue[v]) { // 为什么在当前点被优化的时候才考虑是不是要把它加进队列呢?
que.push(v); // 只有当前点被优化了,与它相邻的点的最短距离才有可能被修改,此时加进队列以松弛以它为顶点的边。
visQue[v] = 1;
cnt[v]++;
if (cnt[v] >= n) return false;
}
}
}
}
return true;
} int sum(int src) {
int temp = 0;
while (fa[src] != -1) {
if (visArmy[src]) return temp;
if (!visArmy[src]) {
temp += num[src];
visArmy[src] = 1;
}
src = fa[src];
}
return temp + num[1];
} int main() {
while(cin >> n >> k) {
memset(head, -1, sizeof(head));
tot = 0;
memset(visArmy, 0, sizeof(visArmy)); for (int i=0; i<n; ++i) { //输入每个城市的叛军数量
cin >> num[i];
}
for (int i=0; i<k; ++i) {
cin >> army[i]; // 输入有军队的城市编号。讲道理,开始还想着,遍历军队的时候也要从n个城市里面去找,蠢了。
}
for (int i=0; i<n-1; ++i) {
int u, v;
cin >> u >> v;
addEdge(u, v);
} fa[1] = -1;
spfa(1); // 以1为源点找最短路
int ans = 0;
for (int i=0; i<k; ++i) {
ans += sum(army[i]); // sum()求当前有军队的城市能消灭的叛军。
//cout << sum(i) << "-----\n";
}
cout << ans << endl;
}
return 0;
}

  

FZU 2169 shadow spfa的更多相关文章

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

    Accept: 28 Submit: 97 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description YL是shadow国的国 ...

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

    原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边, ...

  3. 福州大学 Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 思路:建立一个邻接表,利用搜索中回溯把走过的路标记为1,然后把这些标记为1的值全部加起来. Problem 216 ...

  4. Problem 2169 shadow

     Problem 2169 shadow Accept: 141    Submit: 421 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Pr ...

  5. FZU Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在很多城市.除了王都外有K个城市有军队, ...

  6. FZU2169 shadow题解

    http://acm.fzu.edu.cn/problem.php?pid=2169 Problem Description YL 是shadow国的国王,shadow国有N个城市.为了节省开支,sh ...

  7. FZU 2165 v11(最小重复覆盖)+ codeforces 417D Cunning Gena

    告诉你若干个(<=100)武器的花费以及武器能消灭的怪物编号,问消灭所有怪物(<=100)的最小花费...当然每个武器可以无限次使用,不然这题就太水了╮(╯▽╰)╭ 这题当时比赛的时候连题 ...

  8. HDU 3016 线段树区间更新+spfa

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. In Action(SPFA+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. Android复习

    第一章 1.Android系统架构:(四层) Linux内核层:为安卓设备的各种硬件提供底层的驱动. 系统运行库层:为Android系统提供主要的特性支持. 应用框架层:提供了构建应用程序可能用到的各 ...

  2. timedatectl — Control the system time and date

    timedatectl --help 的执行结果如下: timedatectl [OPTIONS...] COMMAND ... Query or change system time and dat ...

  3. 求连续出现5次以上的值,并且取第5次所在id

    关键字:求连续出现5次以上的值,并且取第5次所在id 关键字:求在某列连续出现N次值的的数据,并且取第M次出现所在行 需求,求连续出现5次以上的值,并且取第5次所在id SQL SERVER: --测 ...

  4. Openstack(五)Memcache- repcached集群

    5.1.1下载Memcache- repcached并解压 # wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repc ...

  5. Deep Learning(1)

    深度学习是机器学习研究中的一个新的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本.深度学习是无监督学习的一种. 深度学习的概念源于人工神经网络的 ...

  6. 1.2 Getting Started--Naming Conventions(命名约定)

    Ember.js使用一个运行时解析器去连接你的对象而没有很多样板文件.作为一个开发者,如果你把code放到约定好的位置这个解析器会自动工作.   一.The Application     1. 当你 ...

  7. 忘记oracle的sys用户密码怎么修改以及Oracle 11g 默认用户名和密码

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. HDU1087

    /*记忆化dfs+dp,因为每次最多走k步,所以上下左右的方向有所扩展, dp[i][j]存的是从dp[i][j]出发能吃的最大个数*/ #include<stdio.h> #includ ...

  9. Apache HttpClient4使用教程

    基于HttpClient 4.5.2 执行GET请求 CloseableHttpClient httpClient = HttpClients.custom() .build(); Closeable ...

  10. 期末总结20135320赵瀚青LINUX内核分析与设计期末总结

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 对LINUX内核分析与设计这 ...