最短路径问题(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**************/