最短路径问题(SPFA)
来源:互联网 发布:c语言 数独源代码 编辑:程序博客网 时间:2024/05/12 19:47
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define INF 0x6fffffffusing 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)输入数据来自:算法导论P3625 101 2 61 3 72 3 82 4 52 5 -43 4 -33 5 94 2 -25 4 75 1 21**************/