最短路径--spfa

最短路径----spfa

单源最短路径

思路:

spfa算法是bellman_ford的队列优化算法,bellman是枚举所有的边,所以其时间复杂度为O(nm),而spfa则是只枚举之前改变了值的边,如果当前点被改变了值,则讲这个点放到队列当中去,如果已经在队列当中了,就不需要再次放入队列当中,然后每次取出队列头部的点,再反复操作,整个图没有点被更新,也就是队列为空的时候。

时间复杂度O(km)(k为常数 m为边数)

Code:

#include<iostream>
#include<queue>
#include<memory.h>
#include<cmath>
using namespace std;
const int N=500005;
int head[N],ver[N],edge[N],ne[N];//邻接表存图
int tot,d[N],v[N];
int n,m,s;
void add(int x,int y,int z)
{
    ver[++tot]=y;//存放终点
    edge[tot]=z;//存放权值
    ne[tot]=head[x];//存放下一个点
    head[x]=tot;//存放起始点
}
queue<int> q;//定义队列
void spfa(int s)
{
    q.push(s);//将起点放入队列
    d[s]=0;//初始化起点的值
    v[s]=1;//标记起点
    while(q.size())//队列里面不为空,如果为空,则证明已经遍历整张图的所有边已经是最短的了
    {
        int x=q.front();//取出队列中的点  就是上一次更新的最小点
        q.pop();//释放刚刚取出的点
        v[x]=0;//取消不在队列的点
        for(int i=head[x];i;i=ne[i])//遍历整张图
        {
            int y=ver[i];//y为终点
            int w=edge[i];//w为权值
            if(d[y]>d[x]+w)//如果起点到y的距离大于起点到x的最短距离加上x到y的距离,则更新起点到y点的距离
            {
                d[y]=d[x]+w;//更新起点到y点的距离
                if(!v[y])//如果y点已经入队 则跳过
                {
                    q.push(y);//将y点入队
                    v[y]=1;
                }
            }
        }
    }
} 
int main()
{
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);//邻接表存图
    }
    for(int i=1;i<=n;i++)
    {
        d[i]=pow(2,31)-1;//初始化所有数组d
    }
    memset(v,0,sizeof(v));//初始化数组v
    d[s]=0;//起点到本身的距离为0
    spfa(s);//调用spfa
    for(int i=1;i<=n;i++)
    cout<<d[i]<<' ';//依次输出到各个点的最短路径
    return 0;
}





全部评论

相关推荐

感觉今年拿到大厂实习offer的人很多,光是身边同学室友都是好几个offer。由此可见,秋招得有多卷
小浪_Coding:必须卷的起飞, 应该比25更卷一点, 25已经是哀声一片了, 26会更难一点, 现在还有`很多25未找到的
点赞 评论 收藏
分享
05-16 11:16
已编辑
东华理工大学 Java
牛客737698141号:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
点赞 评论 收藏
分享
秋盈丶:后续:我在宿舍群里和大学同学分享了这事儿,我好兄弟气不过把他挂到某脉上了,10w+阅读量几百条评论,直接干成精品贴子,爽
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-19 14:46
和女友两个人马上毕业,现在我在鹅实习995,周六日偶尔也去北京;她在北京金融007,经常忙到后半夜,周末也没啥休息机会两个人现在都不咋聊天了,一句话隔半小时甚至半天才回。&nbsp;她是个很优秀的妹子,工作也很努力,是值得学习一辈子的人。我在努力工作求转正,即便不行至少赚到了一段不错的实习经历。已经异地了半年,接下来可能还会持续是这个状态。我们都算是对方重要的人,只是感觉看上去不是很有未来的样子。希望牛友们给点的鼓励
梦旅奇缘:很难。异地首先就已经很难了,加上妹子是金融行业,忙碌高压,对情感需求很高,而且见惯纸醉金迷,你的很多优势在她那里可能就不算什么了。这种情况下,在她们那里遇到一个能及时照顾她的人,即使那人可能很多条件不如你,你也有可能被分手。 说白了,两个卷王就不太适合在一起。因为卷王最大的优势,在另一个卷王那里就不算优势了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务