#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0x6fffffff
using namespace std;
const int maxn = 1000;
const int maxm = 1000000;
typedef struct node{
int w;
int to;
int next;
}NODE;
int dist[maxn];
NODE edge[maxm];
int head[maxn];
bool visit[maxn];
int queue[maxn];
int outque[maxn];
int num = 0;
int s = 0;
int n, m;
bool SPFA(){
int i, k, iq;
int top;
for(i = 0; i <= n; i++){
dist[i] = INF;
}
iq = 0;
queue[iq++] = s;
visit[s] = true;//入队
dist[s] = 0;
i = 0;
while(i != iq){
top = queue[i];
visit[top] = false;//出队
outque[top]++; //记录出队的次数
if(outque[top] > n) { return false; }
k = head[top];
while( k >= 0){
if(dist[edge[k].to] > dist[top] + edge[k].w){
dist[edge[k].to] = dist[top] + edge[k].w;
if(!visit[edge[k].to]){
visit[edge[k].to] = true;//标记入队
queue[iq++] = edge[k].to;
}
}
k = edge[k].next;
}
i++;
}
return true;
}
void output_result(){
for(int i = 1; i <= n; i++){
printf("%d\n", dist[i]);
}
}
void init(){
num = 0;
memset(visit, false, sizeof(visit));
memset(queue, 0, sizeof(queue));
memset(outque, 0, sizeof(outque));
memset(dist, 0, sizeof(dist));
memset(head, -1, sizeof(head));
}
int main()
{
int a = 0, b = 0, c = 0;
while(scanf("%d%d", &n, &m)!=EOF){
init();
for(int i = 0; i < m; i++){
scanf("%d%d%d", &a, &b, &c);
edge[num].w = c;
edge[num].to = b;
edge[num].next = head[a];
head[a] = num;
num++;
}
cout << "please input a source:" << endl;
scanf("%d", &s);
bool res = SPFA();
if(res){
output_result();
}
return 0;
}
}
/******************
SPFA(Shortest Path Faster Algorithm)
输入数据来自:
算法导论P362
5 10
1 2 6
1 3 7
2 3 8
2 4 5
2 5 -4
3 4 -3
3 5 9
4 2 -2
5 4 7
5 1 2
1
**************/
最短路径问题(SPFA)
最新推荐文章于 2022-01-24 01:37:15 发布