%大赛D--链式前向星+SPFA(BFS)+各种数据类型+各种最短路复习
单源最短路模板题,这里尝试用SPFA,但有几点细节:
①不能用邻接矩阵,开不下1e5*1e5的二维数组;邻接表vector<p>G[maxn]或链式前向星
②注意用longlong,而且INF定义为LONG_LONG_MAX(不要手打整数,因为默认为int,也可强制类型转换(1e16))
复习:long double,unsigned long long...log
1e16 double
999999999999999... int(溢出)
③最短路算法复习:
a.Dijkstra
一开始觉得和Prim很像,都用到贪心,而且选好点后,更新与这点相关(可到达)的数据,但是贪心的对象有细微不同。
Prim是dis一维数组(表示目前已加入生成树的点,到其相邻结点的权值的最小值)进行贪心,没有dp的思想;
Dijkstra对松弛操作的dis一维数组(表示起点到该点的最小距离,还要加上前面已经得到的最小距离,而前面得到局部最小距离,必须也是全局最小距离,这是算法成立的关键,也是为什么Dijkstra只支持非负边,这里最优子结构的思想,类似dp)贪心,取出最小所在的的结点P,然后对该点P邻点(这里类似广搜),更新数据,vis标记该点P,最后往复上述操作直到所有vis的点被标记上。
dis 1 2 3 4 5 6 (绿色表示当前取得,红色表示vis标记过已经取过的点,蓝色代表更新的点)
0 7 9 ∞ ∞ 14
0 7 9 ∞ ∞ 14
0 7 9 22 ∞ 14
0 7 9 20 ∞ 11
0 7 9 20 ∞ 11
0 7 9 20 20 11
...
0 7 9 20 20 11
具体思想看看这篇博客:
点击打开链接
b.Floyd
联想到之前离散数学学的传递闭包Warshall求法:
①k 1-n 找到第k列
②i 1-n 找到值为1的行,下标i→if(a[i][k]==1)→则执行③j 1-n a[i][j]=a[k][j]
用到三重循环,Floyd与之类似,只不过思想有所改变:
找到第k个结点作为中间点,比较i到j直达的距离和加了中间点k距离。
c.
最近市面出现了一款全新的游戏,Absolute Counter Online,简称ACO。Asuna跟她的男票Kirito也都跑去玩这个了。
把Kirito传送了K次之后,Asuna终于气消了。。。
最新情报,在这个游戏里,也有传说中的圣剑excalibur,俗称咖喱棒。作为耍剑的高手Kirito自然不能放过这么好的一个机会。游戏里有N那个城市,同时有M条道路连接不同的两个城市,经过不同的道路耗费的时间是不同的。当前Kirito在编号为S的城市,得到的消息是圣剑藏在编号为T的城市中。因为游戏中其他玩家也想抢圣剑,所以Kirito希望用最快的速度到达城市T。而Asuna发现,每个城市中都会有一个传送用的魔法阵,可以快速将他们传送到任意一个城市(没错,这次他们是两人一起传送),不同的魔法阵传送的用时也不同。
Input
多组数据,EOF结尾。
每组数据先输入两个整数N和M,表示有N个城市及M条无向边。
2 <= N <= 100000
1 <= M <= 200000
接下来一行,输入N个整数,第i个数字表示城市i的魔法阵,传送的用时Ui, 1<=Ui<=1000000000。
接下来输入两个整数S和T,表示Kirito他们所在城市,以及圣剑所在城市,1<=S,T<=N 且 S!=T。
接下来M行,每行三个整数X, Y, W,表示一条连接X和Y两个城市的无向边,通过这条边的耗时为W,1<=X,Y<=N, X!=Y, 1<=W<=1000000000。
Output
对于每组数据,输出格式为:“Case #k: u”,k表示第k组数据,从1开始,u表示最短用时。
Sample Input
4 3
1 2 3 4
1 4
1 2 1
2 3 1
3 4 1
4 3
10 2 3 4
1 4
2 1 1
2 3 1
3 4 1
Sample Output
Case #1: 1
Case #2: 3
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=300001;
const long long inf =(long long)(1e16); //不能直接打数字!!!默认是int会WA
struct edge
{ int from,to,next; long long w;
}e[1000001];
int head[maxn];
int vis[maxn];
int vis2[maxn];
long long dist[maxn];
long long mo[maxn];
int n,m,t;
void add(int i,int j,long long w)
{ e[t].from=i; e[t].to=j; e[t].w=w; e[t].next=head[i]; head[i]=t++;
}
long long spfa(int s,int end,int n)
{ queue <int> q; for(int i=1;i<=n;i++) dist[i]=inf; memset(vis,false,sizeof(vis)); memset(vis2,false,sizeof(vis2)); q.push(s); dist[s]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; if(dist[v]>dist[u]+e[i].w) { dist[v]=dist[u]+e[i].w; if(!vis[v]) { vis[v]=true; q.push(v); } }} } long long res= dist[end];for(int i=1;i<=n;i++){res=min(res,dist[i]+mo[i]);}return res;}
int main()
{ int a,b,s,e; long long c;int cnt=1; // scanf("%d%d",&n,&m); while(cin>>n>>m){memset(mo,0,sizeof(mo));t=0; memset(head,-1,sizeof(head)); //memset(dist,0,sizeof(dist));for(int i=1;i<=n;i++){scanf("%lld",&mo[i]);}scanf("%d%d",&s,&e); while(m--) { scanf("%d%d%lld",&a,&b,&c); add(a,b,c); add(b,a,c);} long long res1= spfa(s,e,n); printf("Case #%d: %lld\n",cnt,res1);cnt++;}return 0;
}
%大赛D--链式前向星+SPFA(BFS)+各种数据类型+各种最短路复习相关推荐
- 【模板】链式前向星+spfa
洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...
- 图论:SPFA 算法详解( 算法竞赛入门到进阶) HDU 2544 链式前向星 【提供ACM模板+图解,不会都难!】
文章目录 SPFA简介 链式前向星介绍 SPFA算法思路详细 模板-链式前向星 参考书籍:算法竞赛入门到进阶 罗勇军 SPFA简介 用队列处理Bellman-Ford算法可以很好地优化,这种方法叫做S ...
- Day 7 A - Age of Moyu HDU 6386 | 最短路 | SPFA | 链式前向星
松弛:原来用一根橡皮筋连接p和w两点,现在有一点v到w的路径更短,现在把橡皮筋w点的另一端p换成v点,这样缓解橡皮筋紧绷的压力,让其变得松弛. 来自:原博 关于SPFA算法 来自:原博 链式前向星 # ...
- spfa(链式前向星)+dijkstra(链式前向星)
链式前向星 链式前向星可以存图, 它存图的方式是: 将任意一个节点的所有临边按输入顺序依次连接起来将任意一个节点的所有临边按输入顺序依次连接起来将任意一个节点的所有临边按输入顺序依次连接起来 然后头节 ...
- 蓝桥集训之BFS、DFS和链式前向星
配套视频 https://www.bilibili.com/video/BV1RD4y1F7Fq 一.建图基础 前言 图一般定义为二元集: 由顶点集与边集构成. 或者更抽象的说,由一个集合(顶点),和 ...
- 图论部分模板(基于链式前向星的存储方式)
图论篇部分模板(基于链式前向星的存储方式) 你还在为暴力枚举复杂度太高而苦恼吗?你还在为DP而痛苦吗?你还在为搜索剪枝而绞尽脑汁吗?选择链式前向星吧,链式前向星--专注存图20年 . 1. 链式前向星 ...
- 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)
迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...
- 数据结构【链式前向星】
第一次接触链式前向星是在学习图论的迪杰斯特拉算法时,大佬们纷纷用链式前向星+堆优化+迪杰斯特拉解题,秀的我萌新懵的一批,当时不知道啥是链式前向星,不过随着越来越深入,这种结构见得越来越多,慢慢的就明白 ...
- 前向星和链式前向星(详解+模板)
前向星和链式前向星 参考博客:深度理解链式前向星 什么是前向星 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的 ...
最新文章
- QMetaObject::connectSlotsByName: No matching signal for问题的解决方法
- enscape助手_SDT Enscape助手
- 强化学习6——policy gradient的变种State of the Art
- python sanic openapi_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
- 限定域文本语料的短语挖掘(Phrase Mining)
- VBS操作XML文档,拷贝结点 (转)
- Python学习教程:Python自动化测试框架需要学习哪些?
- C#使用结构来传递多个参数
- 属于自己的MES(二)必备的主数据
- cad批量页码lisp_源代码:批量改页码(加前缀)及提取属性块
- c++中的虚函数及虚函数表
- Oracle | 初级-第一章 Oracle概述
- zing开发者_Zing免费开放Java开发人员
- 2019年十大让人欲罢不能的消费潮流 | 财见年终观察
- 二进制以上的计算机,计算机中的二进制
- 【实用】Visio制作坐标轴
- TransactionDefinition
- 区块链网发布区块链百科的步骤
- 引擎之旅 Chapter.3 文件系统
- 数据分析 - 3.矩阵分析法(学习笔记)