最短路(SPFA版)

最短路有很多种解决方案,如SPFA、Floyd、Dijstra、A*等。接下来我就介绍SPFA

1.简介

SPFA是一种用BFS来求最短路的解决方案,与 Dijstra、A*一样。总体步骤只有一个:bfs

2.代码

1.bfs

/*变量等定义我省略了,只显示核心代码,欢迎在评论区打出这里的代码!*/
void bfs(){
	queue<int> q;
    bool val[100005];
    int dis[100005];
    
    for (int i = 1; i <= n; i++)
    {
    	dis[i]=1e9;
    }
    
    dis[s] = 0;//s为初始节点
    q.push(s);
    val[s]=true;
    
    while(!q.empty()){
    	int t= q.front();
        q.pop();
        
        val[t]=false;
        
        for (int i = 0; i < a[t].size(); i++){//a为结点vector
        	if (dis[a[t][i].first] > dis[t] + a[t][i].second){//判断
            	dis[a[t][i].first] = dis[t] + a[t][i].second;
                
                if (val[a[t][i].first]) continue;
                
                val[a[t][i].first]=true;
                q.push(a[t][i].first);
            }
        }
    }
}

//main
cin >> n >> m >> s;

for (int i = 1; i <= m; i++){
	int x, y, z;
    cin >> x >> y >> z;
    a[x].push({y,z});
}

bfs();

for (int i = 1; i <= n; i++)
{
	if (1e9 != dis[i]) cout << dis[i] << " ";
    else cout << -1 << " ";
}

cout << endl;

这就是SPFA的全部了,点个赞呗。欢迎在评论区留言!

c++算法大全 文章被收录于专栏

本专栏收集了c++大部分基础算法,附有简介和代码。

全部评论
第二个是定义vector 类型为pair,双int,名字叫a。对不对?
2 回复 分享
发布于 08-27 15:43 北京
第一个是int n, m, s;
2 回复 分享
发布于 08-27 15:39 北京
对了, 能不能添加Floyd、Dijstra、A*等算法的文章啊?
点赞 回复 分享
发布于 08-28 18:54 北京
没错!
点赞 回复 分享
发布于 08-28 18:07 北京

相关推荐

08-29 22:26
复旦大学 C++
野猪不是猪🐗:这种有一定名气,但是业务面又窄的中厂是最难进的。前者注定了会有很多人投它,而后者注定了它不会有太多hc
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

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