luoguP3393逃离_僵尸岛_

一道洛谷不知道哪门子月赛的题

可以用此题来练习最短路算法

SPFA和dijkstra的练习题(关于Floyed,他死了

思路:

  本题是最短路板子。

  

  首先就是建立虚点0连向被控制的点,令边长为1,SPFA一遍,求出各点到虚点的距离,然后判断没被控制的各点距离是否不大于s+1,就能处理出所有危险的点,标记一下。

  然后就是跑再一遍SPFA,每次判断连向的点是否被标记,然后选择边权差分约束。

  但是这样算会算上到了n点的花费,而题意到了n点就不需要花费了,于是最后输出的答案还得减去多加的到n点的花费,然后就OK了(注意答案会爆int)。

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue> #define N 100005
#define M 200005
#define INF 1e18
#define ll long long using namespace std; struct edge {
int to;
int from;
}e[M<<1];
int cnt,head[N]; inline void add_edge(int x,int y){
e[++cnt].from = y;
e[cnt].to = head[x];
head[x] = cnt;
}
int n,m,k,s,Q,P;
ll dis[N];
int vis[N],c[N]; void SPFA() {
queue <int> q;
//for(int i=1;i<=n;i++)dis[i]=INF;
memset(dis,0x3f3f3f,sizeof(dis));
for(int i = 1 ; i <= k ; i++){
dis[c[i]] = 0;
vis[c[i]] = 1;
q.push(c[i]);
}
while(!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = head[u] ; i ; i = e[i].to) {
int v = e[i].from;
if(dis[v] > dis[u] + 1) {
dis[v] = dis[u] + 1;
if(!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
}
}
ll w[N];
void spfa(){
queue <int> q;
for(int i = 1 ; i <= n ; i++) {
if(dis[i] <= s) w[i] = Q;
else w[i] = P;
dis[i] = INF;
}
for(int i = 1 ; i <= k ; i++)
w[c[i]] = INF;
vis[1] = 1;
dis[1] = w[n] = w[1] = 0;
q.push(1);
while(!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = head[u] ; i ; i = e[i].to) {
int v = e[i].from;
if(dis[v] > dis[u] + w[u]){
dis[v] = dis[u] + w[u];
if(!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
}
} int main() {
scanf("%d%d%d%d",&n,&m,&k,&s);
scanf("%d%d",&P,&Q);
for(int i = 1 ; i <= k ; i++)
scanf("%d",&c[i]);
for(int i = 1 ; i <= m ; i++) {
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
SPFA();
spfa();
printf("%lld\n",dis[n]);
return 0;
}

最新文章

  1. [变]C#谜题(1-10)表达式篇
  2. JavaScript的chapterIII
  3. JS中this关键字详解
  4. 优化win2d实现的萤火虫粒子效果
  5. xocde真机测试 内存查看
  6. PCA和Softmax分类比较—Mnist与人脸数据集
  7. 剑指offer--面试题8
  8. 从零开始学习jquery (一)
  9. 【二分】Codeforces 706B Interesting drink
  10. php递归json类实例代码
  11. Qt 控件
  12. HDU 1010 Temper of the bone(深搜+剪枝)
  13. shell脚本 expect 实现自动登陆
  14. express学习(三)—— cookie和session
  15. Jmeter 性能测试术语
  16. codeforces #541 D. Gourmet choice(拓扑+并查集)
  17. Sqlserver批量生成10w不重复8位数字
  18. php微服务框架 PHP-MSF 的容器部署和使用
  19. 3. RNN神经网络-LSTM模型结构
  20. 在Ubuntu环境下安装eclipse

热门文章

  1. shell 循环语句
  2. poj 3294 后缀数组 多字符串中不小于 k 个字符串中的最长子串
  3. Redis 创建多个端口 链接redis端口
  4. 理解jquery的$.extend()、$.fn和$.fn.extend()的区别及用法
  5. Hadoop生态圈-HBase的HFile创建方式
  6. oracle中所有存在不存在的用户都可以使用dba连接到数据库
  7. (转)tomcat+nginx+redis实现均衡负载、session共享(一)
  8. poj 2185 Milking Grid
  9. JavaScript中函数和构造函数的区别
  10. C#(.net)水印图片的生成