图论浅析--最短路之SPFA
2015-08-02 17:19
246 查看
SPFA
SPFA即Shortest Path Faster Algorithm,求单源最短路。在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作。
松弛操作必定只会发生在最短路径前导节点松弛成功过的节点上,用一个队列记录松弛过的节点,可以避免了冗余计算。复杂度可以降低到O(kE)。(注:一般k<=2,也可能很大)
Code
struct Edge { int v; int cost; }; vector<Edge>E[NUM]; int n; bool vis[NUM];//在队列标志 int cnt[NUM];//每个点的入队列次数,用来判定是否存在负环回路 int dist[NUM]; queue<int>q; void addedge(int u,int v,int w) { E[u].push_back(Edge(v,w)); } bool SPFA(int start) { memset(vis,false,sizeof(vis)); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++) dist[i]=INF; while(!q.empty())q.pop(); dist[start]=0; vis[start]=true; q.push(start); cnt[start]=1; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=0;i<E[u].size();i++) { int v=E[u][i].v; if(dist[v]>dist[u]+E[u][i].cost) { dist[v]=dist[u]+E[u][i].cost; if(!vis[v]) { q.push(v); vis[v]=true; if(++cnt[v]>n) return false; } } } } return true; }
相关文章推荐
- 用Python实现牛顿法求极值
- skyline 二次开发
- 获得安卓内存空间信息
- 图论浅析--最短路之SPFA
- 自定义TabBar时 去掉TabBar 边缘横线
- hdoj 1200 To and Fro【字符串变形】
- Eclipse(MyEclipse) 设置默认编码为Utf-8 之最全方法
- 关于activity中保存数据
- 交叉验证的缺陷及改进(Cross Validation done wrong)
- HDOJ1073(gets 应用)
- 博客推荐
- UVa 11258 - String Partition(dp)
- 【zoj3524】【Crazy Shopping】
- 图论浅析--最短路之Bellman-Ford
- hihoCoder 1069 最近公共祖先·三
- 图论浅析--最短路之Bellman-Ford
- laravel中的$request对象构造及请求生命周期
- Where is the Marble?
- Leetcode #223 Rectangle Area
- diffork.c