农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查。

他想把牛奶送到T个城镇,编号为1~T。

这些城镇之间通过R条道路 (编号为1到R) 和P条航线 (编号为1到P) 连接。

每条道路 i 或者航线 i 连接城镇Ai到Bi,花费为Ci。

对于道路,0≤Ci≤10,000;然而航线的花费很神奇,花费CiCi可能是负数(−10,000≤Ci≤10,000)。

道路是双向的,可以从Ai到Bi,也可以从Bi到Ai,花费都是Ci。

然而航线与之不同,只可以从Ai到Bi。

事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台了一些政策:保证如果有一条航线可以从Ai到Bi,那么保证不可能通过一些道路和航线从Bi回到Ai。

由于约翰的奶牛世界公认十分给力,他需要运送奶牛到每一个城镇。

他想找到从发送中心城镇S把奶牛送到每个城镇的最便宜的方案。

输入格式

第一行包含四个整数T,R,P,S。

接下来R行,每行包含三个整数(表示一个道路)Ai,Bi,Ci。

接下来P行,每行包含三个整数(表示一条航线)Ai,Bi,Ci。

输出格式

第1..T行:第i行输出从S到达城镇i的最小花费,如果不存在,则输出“NO PATH”。

数据范围

1≤T≤25000,
1≤R,P≤50000,
1≤Ai,Bi,S≤T,

输入样例:

6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10

输出样例:

NO PATH
NO PATH
5
0
-95
-100

思路:首先,这是一个最短路问题。

因为答案要输出从一个源点到每个点的最短路,所以很显然是单源最短路,因此就考虑spfa和dijkstra。

又因为存在负权边,所以dijkstra就不适用了,所以最终选择spfa算法。

注:这道题卡spfa,要用deque优化,在spfa的基础上,在将当前状点放入队列时,根据当前点是否比当前deque的队头更优,分别从队头放入和队尾放入即可,从而优化了维护队列中结点最优状态的时间复杂度。

完整代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <deque>using namespace std;const int maxn=5e5+5;int t,r,p,s;
int dis[maxn],e[maxn<<1],nex[maxn<<1],c[maxn<<1],head[maxn],cnt;
bool vis[maxn];void addEdge(int u,int v,int w)
{e[cnt]=v,c[cnt]=w,nex[cnt]=head[u],head[u]=cnt++;
}void spfa(int s)
{deque<int>dq;memset(vis,false,sizeof vis);memset(dis,0x3f,sizeof dis);dis[s]=0;vis[s]=true;dq.push_back(s);while(dq.size()){int u=dq.front();dq.pop_front();vis[u]=false;for(int i=head[u];~i;i=nex[i]){int v=e[i];if(dis[u]+c[i]<dis[v]){dis[v]=dis[u]+c[i];if(!vis[v]){vis[v]=true;if(dq.size()&&dis[v]<dis[dq.front()]){dq.push_front(v);}else dq.push_back(v);}}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);memset(head,-1,sizeof head);cin>>t>>r>>p>>s;while(r--){int u,v,w;cin>>u>>v>>w;addEdge(u,v,w);addEdge(v,u,w);}while(p--){int u,v,w;cin>>u>>v>>w;addEdge(u,v,w);}spfa(s);for(int i=1;i<=t;i++){if(dis[i]==0x3f3f3f3f) cout<<"NO PATH"<<endl;else cout<<dis[i]<<endl;}return 0;
}

道路与航线(spfa+deque优化)相关推荐

  1. [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  2. AcWing 342. 道路与航线 (连通块Dijkstra+拓扑序||spfa+slf优化)

    整理的算法模板:ACM算法模板总结(分类详细版) 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航 ...

  3. AcWing 342. 道路与航线 (双端队列广搜问题,SPFA)

    题目描述 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航线 (编号为1到P) 连接. 每条道路i ...

  4. 「BZOJ2200」[Usaco2011 Jan] 道路和航线 - 最短路+拓扑排序

    ->点我进原题 [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1116 Solved: 410 Des ...

  5. 342. 道路与航线

    农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到 T 个城镇,编号为 1∼T. 这些城镇之间通过 R 条道路 (编号为 1 到 R) 和 P 条航线 (编号为 1 到 P) 连 ...

  6. 热血航线服务器维护,《航海王热血航线》修复优化了什么 修复优化一览

    航海王热血航线修复优化了什么?航海王热血航线修复优化一直在进行,最新的bug也在修复中,今天小编给大家带来航海王热血航线修复优化一览. 航海王热血航线修复优化一览 修复优化一览 1.洗练属性保存过程优 ...

  7. [蓝桥杯]算法提高 道路和航路(spfa+deque+快读优化)

    问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1-T),这些城镇通过R条标号为(1-R)的道路和P条标号为(1-P)的航路相连. 每一条公路i或者航路i表 ...

  8. [洛谷1462 ]通往奥格瑞玛的道路---二分答案+spfa

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  9. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

最新文章

  1. 高并发服务优化篇:从RPC预热转发看服务端性能调优
  2. BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
  3. 计算机动画整个的发展历史,三维动画的发展史
  4. .NET Core前后端分离快速开发框架(Core.3.0+AntdVue)
  5. python缺省参数与多个函数返回值
  6. MySQL运维实战系列:MySQL5.7 Group By 问题
  7. 你生孩子的时候有什么神奇的经历吗?
  8. 两种数据仓库分层实例
  9. echarts中国地图下钻到区
  10. 物联网、大数据、云计算、人工智能之间的关系
  11. Sunshine 项目构思
  12. 计算机英语口语面试自我介绍,面试英文口语自我介绍(精选8篇)
  13. macmini性能测试软件,Mac mini
  14. Ipad开发课程系列目录--很好的教程,推荐给大家
  15. 一步完成最小二乘法、递推最小二乘法、增广最小二乘法、广义最小二乘法、辅助变量法、二步法辨识(传递函数)
  16. 微信7.0版本与旧版更新对比 新版微信7.0版更新了什么
  17. 专业系统维护:CleanMyMac X for mac
  18. 【python学习】Python开心消消乐实现过程基础1
  19. outlook搜索栏跑到上面去了_都市农园 周末去谈一场恋爱,顺便买回一座花园
  20. JDK8最新版本jdk-8u331

热门文章

  1. 知网垄断实锤,遭8760万「天价罚单」制裁!撬动知网第一人,九旬教授赵德馨回应
  2. 误差逆传播算法公式理解及推导
  3. 【NLP】从双曲面到双曲几何庞加莱盘
  4. google hacker语句
  5. 【面试题 08.11】 硬币(动态规划)
  6. 渗透测试方法论5---测试会话管理机制
  7. centos7永久关闭防火墙
  8. oracle向上取整10倍数,Oracle四舍五入,向上取整,向下取整
  9. Python之路【第十七篇】:Django【进阶篇 】(转自银角大王博客)
  10. 【fiddler+burp+雷神模拟器联动抓包】