您的位置:首页 > 其它

hihoCoder#1093 最短路径·三:SPFA算法

2015-04-06 20:17 330 查看
原题地址

宽搜+剪枝,不是说好了适用于稀疏矩阵的嘛,怎么题目的测试数据边数达到10^6。。。不科学

代码:

#include <iostream>
#include <cstring>
#include <map>

using namespace std;

#define MAX_POINT 100008
#define MAX_EDGE 1000008

int N, M, S, T;
int p[MAX_POINT];
int q[MAX_POINT];
int d[MAX_POINT];
map<int, map<int, int> > g;
int head, tail;

void spfa() {
for (int i = 0; i < N; i++)
p[i] = -1;
memset(d, 1, sizeof(d));
head = tail = 0;
d[S] = 0;
p[S] = tail;
q[tail++] = S;

while (head < tail) {
int s = q[head++];
for (auto t : g[s]) {
int len = d[s] + t.second;
if (len < d[t.first]) {
d[t.first] = len;
if (p[t.first] < 0) {
p[t.first] = tail;
q[tail++] = t.first;
}
}
}
p[s] = -1;
}
}

int main() {
scanf("%d%d%d%d", &N, &M, &S, &T);
for (int i = 0; i < M; i++) {
int a, b, len;
scanf("%d%d%d", &a, &b, &len);
if (!g[a][b])
g[a][b] = g[b][a] = len;
else
g[a][b] = g[b][a] = min(g[a][b], len);
}

spfa();

printf("%d\n", d[T]);

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