博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P3393 逃离僵尸岛
阅读量:6799 次
发布时间:2019-06-26

本文共 1866 字,大约阅读时间需要 6 分钟。

     

 luoguP3393逃离_僵尸岛_

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

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

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

思路:

  本题是最短路板子。

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

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

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

code:

#include
#include
#include
#include
#include
#include
#define N 100005#define M 200005#define INF 1e18#define ll long longusing 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
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
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;}

转载于:https://www.cnblogs.com/Repulser/p/9600635.html

你可能感兴趣的文章
Linux at命令定时发送邮件具体用法
查看>>
hudson无法访问问题,linux防火墙问题
查看>>
arcEngine 10 C++ 坐标转换【坐标系的投影】
查看>>
Java6 WebService学习
查看>>
命名规则 : 匈牙利法则
查看>>
适用于单选的jQuery Auto-complete插件SelectToAutocomplete
查看>>
我的Windows 8下看漫画程序差不多可以用了
查看>>
rabbitmq使用__python客户端(消息接收者)
查看>>
如何实现一套鼠标键盘控制二台主机
查看>>
html5 手机页面
查看>>
Ubuntu 配置VNC以及使用VNC连接时,无法显示系统菜单栏,解决方法
查看>>
c# 如何通过反射 获取\设置属性值、
查看>>
分享:Apache OpenNLP 1.5.3 发布
查看>>
PCB_栅格大小设置
查看>>
在eclipse 的整个工程中查找字符串
查看>>
[转]Android中的Intent详细讲解
查看>>
电商也要懂的实体渠道实战知识zz
查看>>
命令行管理远程windows.(Remote Command Line On Windows)
查看>>
调用webservice使用URLConnection调用webservice
查看>>
父亲节例行吐槽
查看>>