图算法--spfa

spfa的最坏时间复杂度是O(nm),但是一般达不到这么高

spfa是bellman-ford算法的升级版,bellman-ford是每次对所有的边判断是否可以松弛,但是实际上只有从刚刚松弛的点出发的边才有可能松弛其他点

所以就可以省去很大一部分的判断

复制代码
 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 const int N=1e5+10;
 6 int n,m;
 7 int h[N],e[N],w[N],ne[N],idx;
 8 int dis[N];
 9 bool st[N];
10 void add(int a,int b,int c){
11     e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
12 }
13 int spfa(){
14     memset(dis,0x3f,sizeof(dis));
15     queue<int> q;
16     
17     dis[1]=0;
18     q.push(1);
19     st[1]=true;
20     while(q.size()){
21         int t=q.front();
22         q.pop();
23         st[t]=false;
24         for(int i=h[t];i!=-1;i=ne[i]){
25             int j=e[i];
26             if(dis[j]>dis[t]+w[i]){
27                 dis[j]=dis[t]+w[i];
28                 if(!st[j]){
29                     q.push(j);
30                     st[j]=true;
31                 }
32             }
33         }
34     }
35     return dis[n];
36 }
37 int main(void){
38     cin>>n>>m;
39     memset(h,-1,sizeof(h));
40     for(int i=0;i<m;i++){
41         int a,b,c;
42         cin>>a>>b>>c;
43         add(a,b,c);
44     }
45     int res=spfa();
46     if(res==0x3f3f3f3f) cout<<"impossible";
47     else cout<<res;
48     return 0;
49 }
复制代码

 

posted on   greenofyu  阅读(129)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示