Spfa
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。
数据保证不存在负权回路。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出”impossible”。
数据范围
1≤n,m≤105,
图中涉及边长绝对值均不超过10000。
输入样例:
3 3
1 2 5
2 3 -3
1 3 4
输出样例:
2
Spfa是一种求有负数的最短路算法
时间复杂度: O(m) ~ O(n*m) 不稳定
空间复杂度:O(n)
总的来说,Spfa就是Bellman_Ford算法的优化,所已看这篇文章前推荐看一下这篇文章:
【模板】Bellman_Ford
Spfa就是定义一个队列,将所有有可能能优化最短路的点全都放进去,最后拿出来一个个判断就可以了
主要代码如下:
void Spfa()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
queue<int> q;
q.push(1);
st[1]=true;
while(!q.empty())