前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单源最短路径算法——Dijkstra算法

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

作者头像
RainMark
发布2019-09-10 19:46:51
1.1K0
发布2019-09-10 19:46:51
举报
文章被收录于专栏:RainMark 的文章
代码语言:javascript
复制
#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语言描述第二版)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-12-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档