单源最短路径算法——Dijkstra算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAXN (10001)
#define INF  (1<<16)

typedef struct _Vertex
{
    int w[MAXN];
    int cw;
    int know;
    int dis;
    int path;
    int ew[MAXN]; /*The edge weight of curent vertex to w[i] */
    
}Graph;

Graph G[MAXN];

int read_graph ( void )
{
    int i, k;
    int n, m, ew;
    
    scanf ("%d", &n );
    for ( i = 0 ; i < n; i++ ) {
        scanf ("%d", &m ); G[i].cw = m; G[i].know = 0; G[i].dis = INF; G[i].path = -1;
        for ( k = 0; k < m; k++ ) scanf ("%d%d", &G[i].w[k], &G[i].ew[k] );
    }
    
    return n;
}

int find ( int n )
{
    int i;
    int m;
    
    for ( m = -1, i = 0; i < n; i++ ) if ( !G[i].know ) { m = i; break; }
    if ( m < 0 ) return -1;
    
    for ( i = m + 1; i < n; i++ ) {
        if ( !G[i].know ) {
            if ( G[i].dis < G[m].dis ) m = i;
        }
    }
    return m;
}

void dijst ( int v , int n)
{
    int i, k;
    int min;
    int *w = NULL;
    int cw;
    
    G[v].dis = 0;
    
    while (1) {
        min = find ( n );
        if ( min < 0 ) {  /*Have no vertex to continue*/
            break;
        }
        
        G[min].know = 1;
        w = G[min].w; cw = G[min].cw;
        for ( i = 0; i < cw; i++ ) {
            if ( !G[ w[i] ].know ) {
                if ( G[min].dis + G[min].ew[i] < G[ w[i] ].dis ) { 
                    G[ w[i] ].dis = G[min].dis + G[min].ew[i];
                    G[ w[i] ].path = min;
                }
            }     
        }
    }
}

void print_path ( int v )
{
    if ( G[v].dis > 0 ) {
        print_path ( G[v].path );
        printf ("->v%d", v + 1 );
    } else 
        printf ("v%d", v + 1 );
}

int main(int argc, char *argv[])
{
    int n;
    int i;
    
    freopen ( "data.txt" , "r" , stdin );
    n = read_graph ();
    dijst ( 0 , n );

    for ( i = 0; i < n; i++ ) { 
        print_path ( i );
        printf("\n");
    }
    return 0;
}

 

输入数据:

7
2 1 2 3 1
2 3 3 4 10
2 5 5 0 4
4 2 2 4 2 5 8 6 4
1 6 6
0
1 5 1

 

参考书籍:数据结构与算法分析(C语言描述第二版)

posted @ 2015-12-02 22:33  RainMark  阅读(976)  评论(0编辑  收藏  举报