最短パス問題(SPFA)


#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
", 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 **************/