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 }