spfa求单源最短路

来源:互联网 发布:centos rm 恢复 编辑:程序博客网 时间:2024/06/09 17:58

spfa的策略是松弛:设置一个队列用来保存被优化的节点,优化时每次取出队头节点u,然后对u 的相邻节点进行松弛操作,如果v点进行了松弛操作,并且v不再当前队列中,就将v放入队尾,。这样不断从队列中取出节点来进行松弛操作,直到队列为空。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 1005;const int inf = 999999999;struct EDGE{  int to;  int next;  int w;};EDGE edge[maxn];int num;int head[maxn];bool inque[maxn];int dist[maxn];void init(){  num = 0;  memset(head,-1,sizeof(head));  memset(inque,false,sizeof(inque));  for(int i = 0; i < maxn; i++)  dist[i] = inf;}void add(int from,int to,int w){  edge[num].to = to;  edge[num].w = w;  edge[num].next = head[from];  head[from] = num++;}void spfa(int s){  dist[s] = 0;  inque[s] = true;  queue<int>Q;  Q.push(s);   while(!Q.empty()){     int u = Q.front();     Q.pop();     for(int i = head[u]; i != -1; i = edge[i].next){       int v = edge[i].to;       if(dist[u] + edge[i].w < dist[v])       dist[v] = dist[u] + edge[i].w;       if(!inque[v]){         inque[v] = true;         Q.push(v);       }     }     inque[u] = false;   }}int main(){  int n,m,s,t;  while(cin>>n>>m){    init();    while(m--){      int u,v,w;      scanf("%d%d%d",&u,&v,&w);      add(u,v,w);    }    cin>>s>>t;    spfa(s);    cout<<dist[t]<<endl;  }    return 0;}


0 0
原创粉丝点击