Dijkstra

2017-06-11  本文已影响46人  滑二稽
#include <stdio.h>
#define MAXN 100
#define inf 1000.0

double dist[MAXN];
int p[MAXN];
void dijk(int u, double C[MAXN][MAXN], int n){
    bool s[MAXN] = {false};

    for(int i = 0; i < n; i++){
        dist[i] = C[u][i];
        if(dist[i] >= inf)  p[i] = -1;
        else  p[i] = u;
    }

    dist[u] = 0;
    s[u] = true;

    for(int i = 0; i < n; i++){
        double tmp = inf;
        int t = u;
        for(int j = 0; j < n; j++)
        if(!(s[j]) && (dist[j] < tmp)){
            t = j;
            tmp = dist[j];
        }

        if(t == u)  break;
        s[t] = true;

        for(int j = 0; j < n; j++)
        if(!(s[j]) && (C[t][j] < inf) && (dist[j] > dist[t] + C[t][j])){
            dist[j] = dist[t] + C[t][j];
            p[j] = t;
        }
    }
}

int main(){
    double C[MAXN][MAXN];
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            scanf("%lf", C[i]+j);

    dijk(0, C, n);

    for(int i = 0; i < n; i++)
        printf("%.4f\t", dist[i]);
    printf("\n");
    for(int i = 0; i < n; i++)
        printf("%d\t", p[i]);

    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读