spfa 算法模板
2016-07-27 10:39
381 查看
#include <bits/stdc++.h> #define MEM(a,x) memset(a , x , sizeof(a)) using namespace std; typedef int weight_t; const int SIZE_E = //1000000; 注意是双向边 题目的m条边 在mkEdge里面存了两条 const int SIZE_V = //1050; int n; int ECnt = 0; struct edge_t{ int v; weight_t w; edge_t *next; }Edge[SIZE_E]; edge_t *V[SIZE_V]; void mkEdge(int const &a,int const &b,weight_t const &w){ Edge[ECnt].v = b; Edge[ECnt].w = w; Edge[ECnt].next = V[a]; V[a] = Edge+ECnt++; Edge[ECnt].v = a; Edge[ECnt].w = w; Edge[ECnt].next = V[b]; V[b] = Edge+ECnt++; } weight_t D[SIZE_V]; bool flag[SIZE_V]; void spfa(int s){ MEM(flag,0); fill(D,D+SIZE_V,INT_MAX); D[s] = 0; flag[s] = true; queue<int>q; q.push(s); while(!q.empty()){ int u = q.front(); q.pop(); flag[u] = false; for(edge_t *p = V[u];p;p = p->next){ int v = p->v; weight_t temp = D[u] + p->w; if (temp < D[v]){ D[v] = temp; if (!flag[v]){ flag[v] = true; q.push(v); } } } } } void init(){ ECnt = 0; memset(V,0,sizeof(V)); MEM(Edge,0); }
使用邻接矩阵的存储方式
#include <bits/stdc++.h>
#define MEM(a,x) memset(a , x , sizeof(a))
using namespace std;
/**下标从1开始,只能存一条边
*注意初始化
*/
typedef int weight_t;
const int SIZE_V = 110;
int n;
weight_t Road[SIZE_V][SIZE_V];
///不能存多条边,所以存边要先判断
inline void mkEdge(int const &a,int const &b,weight_t const &w){
Road[a][b] = Road[b][a] = w;
}
weight_t D[SIZE_V];
bool flag[SIZE_V];
void spfa(int s){
MEM(flag,0);
fill(D,D+SIZE_V,INT_MAX);
D[s] = 0;
flag[s] = true;
queue<int>q;
q.push(s);
while(!q.empty()){
int u = q.front();
q.pop();
flag[u] = false;
for (int i = 1;i <= n;++i){
///注意是减法,初始化没边是int_max,加上D[u]会变成负数
if ( D[i] - Road[u][i] > D[u] ){
D[i] = Road[u][i]+D[u];
if (!flag[i]){
flag[i] = true;
q.push(i);
}
}
}
}
}
void init(){
for (int i = 0;i<= n;++i)for (int j = 0;j <= n;++j){
Road[i][j] = INT_MAX;
}
}
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法