SPFA最短路

mac2022-06-30  26

//spfa有属于对bellman_ford的优化,主要就是bellman_ford的内层循环太多(M次),所以SPFA利用队列来减少这个循环 #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=100010; int dist[N],q[N]; int h[N],e[N],ne[N],w[N],idx; int n,m; bool st[N]; void add(int a,int b,int c) { e[idx]=b, w[idx]=c, ne[idx]=h[a], h[a]=idx++; } int spfa() { memset(dist, 0x3f, sizeof dist); dist[1]=0; //用队列来优化 queue<int> q; q.push(1); st[1]=true; while(q.size()) { int t=q.front(); q.pop(); st[t]=false;//这个st[]到底是干嘛的? for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i]; if(!st[j])//这个地方不理解,为什么要分开写,而不能在上一个if中一起限制? { q.push(j); st[j]=true; } } } } if(dist[n]==0x3f3f3f3f) return -1; return dist[n]; } int main() { cin>>n>>m; memset(h, -1, sizeof h); while(m--) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } int t=spfa(); if(t==-1) cout<<"impossible"<<endl; else cout<<t<<endl; return 0; }

 

最新回复(0)