【SPFA】【最短路/次短路】GF打Dota
GF打Dota
题目大意:
求一个点到另一个点的最短路或次短路
原题:
题目描述
众所周知,GF同学喜欢打dota,而且打得非常好。今天GF和Spartan同学进行了一场大战。现在GF拿到一张地图,地图上一共有n个地点,GF的英雄处于1号点,Spartan的基地位于n号点,GF要尽快地选择较短的路线让他的英雄去虐掉Spartan的基地。但是Spartan早就料到了这一点,他有可能会开挂(BS~)使用一种特别的魔法,一旦GF所走的路线的总长度等于最短路的总长度时,GF的英雄就要和这种魔法纠缠不休。这时GF就不得不选择非最短的路线。现在请你替GF进行规划。
对于描述的解释与提醒:
1.无向路径,花费时间当然为非负值。
2.对于本题中非最短路线的定义:不管采取任何迂回、改道方式,只要GF所走的路线总长度不等于1到n最短路的总长度时,就算做一条非最短的路线。
3.保证1~n有路可走。
输入
第一行为n,m(表示一共有m条路径)
接下来m行,每行3个整数a,b,c,表示编号为a,b的点之间连着一条花费时间为c的无向路径。
接下来一行有一个整数p,p=0表示Spartan没有开挂使用这种魔法,p=1则表示使用了。
输出
所花费的最短时间t,数据保证一定可以到达n。
输入样例
样例输入1:
5 5
1 2 1
1 3 2
3 5 2
2 4 3
4 5 1
0
样例输入2:
5 5
1 2 1
1 3 2
3 5 2
2 4 3
4 5 1
1
输出样例
样例输出1:
4
样例输出2:
5
说明
对于50%的数据,1<=n,m<=5000
对于70%的数据,1<=n<=10000, 1<=m<=50000,p=0,
对于100%的数据,1<=n<=10000, 1<=m<=50000,p=1
无向图,花费时间c>=0
解题思路:
正着跑一遍SPFA,是第一个点到每一个点的最短路(a),倒着跑一遍SPFA,是每个点到n的最短路(b),如果是最短路就直接输出,如果是次短路,就枚举每一条边,将其中一个点的a和另一个点的b再加上这条边的长度,求出这条路线的长度,在这些中找出次短路即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int n,m,x,y,c,w,pp,now,ans,sum,aa[50005],bb[50005],cc[50005],b[10005],b1[10005],p[10005],head[10005];
struct rec
{int to,next,l;
}a[100005];
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=m;++i){scanf("%d %d %d",&x,&y,&c);aa[i]=x;//记录线bb[i]=y;cc[i]=c;a[++w].to=y;//邻接表a[w].l=c;a[w].next=head[x];head[x]=w;a[++w].to=x;//双向a[w].l=c;a[w].next=head[y];head[y]=w;}scanf("%d",&pp);memset(b,127/3,sizeof(b));memset(b1,127/3,sizeof(b1));queue<int>d;d.push(1);b[1]=0;p[1]=1;while(!d.empty())//正着{now=d.front();d.pop();for (int i=head[now];i;i=a[i].next)if (b[now]+a[i].l<b[a[i].to]){b[a[i].to]=b[now]+a[i].l;if (!p[a[i].to]){p[a[i].to]=1;d.push(a[i].to);}}p[now]=0;}if (!pp){printf("%d",b[n]);return 0;}sum=b[n];d.push(n);b1[n]=0;p[n]=1;while(!d.empty())//倒着{now=d.front();d.pop();for (int i=head[now];i;i=a[i].next)if (b1[now]+a[i].l<b1[a[i].to]){b1[a[i].to]=b1[now]+a[i].l;if (!p[a[i].to]){p[a[i].to]=1;d.push(a[i].to);}}p[now]=0;}ans=2147483647;for (int i=1;i<=m;++i){if (b[aa[i]]+b1[bb[i]]+cc[i]>sum)//连接线ans=min(ans,b[aa[i]]+b1[bb[i]]+cc[i]);if (b[bb[i]]+b1[aa[i]]+cc[i]>sum)//反过来ans=min(ans,b[bb[i]]+b1[aa[i]]+cc[i]);}printf("%d",ans);
}
【SPFA】【最短路/次短路】GF打Dota相关推荐
- cogs 826. [Tyvj Feb11] GF打dota 次短路详细原创讲解! dijkstra
826. [Tyvj Feb11] GF打dota ★★☆ 输入文件:dota.in 输出文件:dota.out 简单对比 时间限制:1 s 内存限制:128 MB 众所周知,GF同学 ...
- 最短路——最短路计数(spfa)
题目链接 最短路--最短路计数(spfa) 题目描述 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N.问从顶点 1 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 2 个正整 ...
- 最短路——最短路(spfa)
题目链接 最短路--最短路(spfa) 题目描述 简单暴力的题目要求: 给定一个有n个顶点(从1到n编号),m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路. ...
- spfa 单源最短路究极算法
学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. SPFA算法是西南交通大学段凡丁于1994年发表的. 从名 ...
- 蓝桥杯最短路(java过)spfa单源最短路算法
spfa 百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最 ...
- (CSP2019·J T4)加工零件【spfa】【最短路】
题目是真的长 思路: 这道题求得就是a到l能否到达一步 确定dfs会TLE所以用最短路,floyedT飞,dij+ 堆优化不会,只能用spfa 因为n可能=m会形成环 所以判断奇偶分别求 CodeCo ...
- SPFA算法求最短路
AcWing 851. spfa求最短路 题目 https://www.acwing.com/problem/content/submission/853/ 给定一个 n 个点 m 条边的有向图,图中 ...
- 1379:热浪(heatwv)(SPFA单源最短路)
德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!! 他们的德克萨斯长角牛吃起来不错,可是它们并不是很擅长生产富含奶油的乳制品. 农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重 ...
- NOIP模拟题 2016.11.15 [LIS] [spfa] [同余最短路] [矩阵快速幂] [容斥原理] [数学]
小L的二叉树 [题目描述] 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个 ...
最新文章
- 罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...
- 吴恩达《Machine Learning》Jupyter Notebook 版笔记发布!图解、公式、习题都有了
- Sumblime Text 2 常用插件以及安装方法
- centos6.7一键装机
- linux mv 保持目录结构_Linux中的mv命令详解
- github(入门),不入门找卢姥爷
- MACOS远程访问树莓派桌面
- eps如何建立立体白模_服装立体裁剪教程 结构都是“立裁”出来的 才智服装
- std::optional
- 轻量级java web实践-6(框架源码-4)
- VS2010/MFC编程入门之前言
- Caffe学习-手写数字识别
- 惠普z800工作站bios设置_HP工作站 BIOS说明 适用Z228 Z440 Z230 Z640 Z840 Z800 Z620 Z420 Z820主板设置 -...
- java war 打包、解压命令
- revel MySQL_Revel 教程
- Java 基础学习笔记
- 当你们玩挂机游戏累了(_杰森大师_JAVA)
- 杭电考研经验贴———报考计算机专业,慎重!!!
- 永恒之塔修改服务器名字,永恒之塔修改称号提升人物各种属性教程
- java监听设计模式(java观察者设计模式)
热门文章
- nginx lua以html显示,nginx 支持lua及lua脚本格式化日志
- 1093芯片做正弦波逆变器_长途自驾游“缺电”如何选购正确车载逆变器,避开商家套路...
- vue实现侧边折叠菜单栏手风琴效果
- 确定S中最接近中位数的k个元素(算法导论第三版9.3-7)
- number six
- Subset POJ - 3977(折半枚举+二分+二进制枚举)
- 用python输出12和8的最大公_重点汇总-python常见问题1
- SpringCloud Alibaba 框架下公司架构图
- 线性代数---线性方程组
- 经典排序算法(3)——直接插入排序算法详解