您的位置:首页 > 其它

spfa 快速最短路-队列优化

2017-05-20 13:34 459 查看
spfa 快速最短路-队列优化,可以用
hdu2544 验证算法的正确性

里面的spfa算法摘自acdart 的板子。把这个函数记录在网上,以免忘记。我再理解下。

spfa就是维护一个队列,这个队列中的点可以进行松弛操作。2017-8-25再次修改

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int maxn = 1e4 + 7;
struct Edge {
int to;
int val;
int Next;
}edge[maxn]; //只有这个数组范围与边有关
int head[maxn];//数组范围与点数有关
bool vis[maxn];
int dis[maxn];
//int cnt[maxn];
int n, m, tot;
void init() {
tot = 0;
memset(head, -1, sizeof(int) * maxn);
}
void add(int u, int v, int w) {
edge[tot].to = v;
edge[tot].val = w;
edge[tot].Next = head[u];
head[u] = tot++;
}
bool spfa(int s) {
queue<int> que;
memset(dis, 0x7f, sizeof(int) * maxn);
memset(vis, 0, sizeof(bool) * maxn);
//memset(cnt, 0, sizeof(int) * maxn);
vis[s] = true;
dis[s] = 0;
//cnt[s] = 1;
que.push(s);
while (!que.empty()) {
int u = que.front();
que.pop();
vis[u] = false;
for (int i = head[u]; ~i; i = edge[i].Next) {
int v = edge[i].to;
if (dis[v] > dis[u] + edge[i].val) {
dis[v] = dis[u] + edge[i].val; //pre[v] = u;//记录路径
if (!vis[v]) {
//是否存在负环
/*if (++cnt[v] > n) {
return false;
}*/
vis[v] = true;
que.push(v);
}
}
}
}
return true;
}
int main()
{
int m;
while (~scanf("%d%d", &n, &m)) {
if (!(n | m)) {
break;
}
init();
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
spfa(1);
printf("%d\n", dis
);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: