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相关推荐

  1. cogs 826. [Tyvj Feb11] GF打dota 次短路详细原创讲解! dijkstra

    826. [Tyvj Feb11] GF打dota ★★☆   输入文件:dota.in   输出文件:dota.out   简单对比 时间限制:1 s   内存限制:128 MB 众所周知,GF同学 ...

  2. 最短路——最短路计数(spfa)

    题目链接 最短路--最短路计数(spfa) 题目描述 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N.问从顶点 1 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 2 个正整 ...

  3. 最短路——最短路(spfa)

    题目链接 最短路--最短路(spfa) 题目描述 简单暴力的题目要求: 给定一个有n个顶点(从1到n编号),m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路. ...

  4. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.      SPFA算法是西南交通大学段凡丁于1994年发表的.     从名 ...

  5. 蓝桥杯最短路(java过)spfa单源最短路算法

    spfa 百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最 ...

  6. (CSP2019·J T4)加工零件【spfa】【最短路】

    题目是真的长 思路: 这道题求得就是a到l能否到达一步 确定dfs会TLE所以用最短路,floyedT飞,dij+ 堆优化不会,只能用spfa 因为n可能=m会形成环 所以判断奇偶分别求 CodeCo ...

  7. SPFA算法求最短路

    AcWing 851. spfa求最短路 题目 https://www.acwing.com/problem/content/submission/853/ 给定一个 n 个点 m 条边的有向图,图中 ...

  8. 1379:热浪(heatwv)(SPFA单源最短路)

    德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!! 他们的德克萨斯长角牛吃起来不错,可是它们并不是很擅长生产富含奶油的乳制品. 农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重 ...

  9. NOIP模拟题 2016.11.15 [LIS] [spfa] [同余最短路] [矩阵快速幂] [容斥原理] [数学]

    小L的二叉树 [题目描述] 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个 ...

最新文章

  1. 罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...
  2. 吴恩达《Machine Learning》Jupyter Notebook 版笔记发布!图解、公式、习题都有了
  3. Sumblime Text 2 常用插件以及安装方法
  4. centos6.7一键装机
  5. linux mv 保持目录结构_Linux中的mv命令详解
  6. github(入门),不入门找卢姥爷
  7. MACOS远程访问树莓派桌面
  8. eps如何建立立体白模_服装立体裁剪教程 结构都是“立裁”出来的 才智服装
  9. std::optional
  10. 轻量级java web实践-6(框架源码-4)
  11. VS2010/MFC编程入门之前言
  12. Caffe学习-手写数字识别
  13. 惠普z800工作站bios设置_HP工作站 BIOS说明 适用Z228 Z440 Z230 Z640 Z840 Z800 Z620 Z420 Z820主板设置 -...
  14. java war 打包、解压命令
  15. revel MySQL_Revel 教程
  16. Java 基础学习笔记
  17. 当你们玩挂机游戏累了(_杰森大师_JAVA)
  18. 杭电考研经验贴———报考计算机专业,慎重!!!
  19. 永恒之塔修改服务器名字,永恒之塔修改称号提升人物各种属性教程
  20. java监听设计模式(java观察者设计模式)

热门文章

  1. nginx lua以html显示,nginx 支持lua及lua脚本格式化日志
  2. 1093芯片做正弦波逆变器_长途自驾游“缺电”如何选购正确车载逆变器,避开商家套路...
  3. vue实现侧边折叠菜单栏手风琴效果
  4. 确定S中最接近中位数的k个元素(算法导论第三版9.3-7)
  5. number six
  6. Subset POJ - 3977(折半枚举+二分+二进制枚举)
  7. 用python输出12和8的最大公_重点汇总-python常见问题1
  8. SpringCloud Alibaba 框架下公司架构图
  9. 线性代数---线性方程组
  10. 经典排序算法(3)——直接插入排序算法详解