SPFA整体过程
1.用一个队列queue
支撑。
2.dis[i]
表示目前x
到i
的距离。
3.b[i]
表示i
是否在q
中。
4.清空队列while(q.size()) q.pop();
。
5.初始化(把所有的dis[i]
设为INF
,再把dis[x]
设为0
,因为x
到x
的距离是0
)。
6.把当先点入队q.push(x);
。
7.取出队首,存在temp
中,b[队首]
= false
。
8.更新每一个点(dis[j] = min(dis[temp] + mp[temp][j],dis[j]);
)。
9.如果它没有在q
中则把它入队,并把b[i]
标记成true
。
10.如果队列不空则继续第7步。
code
#include <iostream>
#include <queue>
using namespace std;
#define inf 0x3f3f3f3f
int mp[105][105], dis[105], vis[105], num[105], n, m;
queue<int> q;
void SPFA(int x) {
while(q.size()) q.pop();
for (int i = 1; i <= n; i++) {
dis[i] = inf;
}
dis[x] = 0;
q.push(x);
while (!q.empty()) {
int temp = q.front();
q.pop();
for (int j = 1; j <= n; j++) {
if (dis[j] > mp[temp][j] + dis[temp]) {
dis[j] = dis[temp] + mp[temp][j];
if (!vis[j]) {
q.push(j);
vis[j] = 1;
num[j]++;
}
}
}
vis[temp] = 0;
}
}
int main() {
while (cin >> n >> m && n + m) {
int a, b, c;
for (int i = 1; i <= n; i++) {/赋予INF
for (int j = 1; j <= n; j++) {
if (i == j) {、、特判
mp[i][j] = 0;
} else {
mp[i][j] = inf;
}
}
}
for (int i = 1; i <= m; i++) {
cin >> a >> b >> c;
if (mp[a][b] > c) {
mp[a][b] = mp[b][a] = c;
}
}
SPFA(1);
cout << dis[n] << endl;
}
return 0;
}
完结散花!