• [算法] dijkstra单源无负权最小路径算法


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

    #define INF 1000000
    #define MAXN 32

    int N;
    int matrix[MAXN][MAXN];

    int dist[MAXN];
    int path[MAXN];
    int s[MAXN];

    void dijkstra(int u){
       
    /* init */
       
    int i, j, k;
       
    int min;
       
    int v;
       
    int tmp;

       
    for(i =0; i < N; i++){
            s
    [i]=0;    
            dist
    [i]= matrix[u][i];
           
    if(dist[i]!= INF && i != u){
                path
    [i]= u;
           
    }
           
    else{
                path
    [i]=-1;
           
    }
       
    }
        s
    [u]=1;
        dist
    [u]=0;
       
       
    for(i =1; i < N; i++){
            min
    = INF;
           
    for(j =0; j < N; j++){
               
    if(!s[j]&& dist[j]< min){
                    min
    = dist[j];    
                    v
    = j;
               
    }
           
    }    
            s
    [v]=1;
           
    for(k =0; k < N; k++){
               
    if(s[k]){
                   
    continue;    
               
    }
                tmp
    = dist[v]+ matrix[v][k];
               
    if(dist[k]> tmp){
                    dist
    [k]= tmp;
                    path
    [k]= v;
               
    }            
           
    }
       
    }
    }

    void print_path(int u){
       
    int rev[MAXN];
       
    int count =0;
       
    int i;
       
    int v;
       
        memset
    (rev,0,sizeof(rev));

        rev
    [count++]= u;
        v
    = path[u];
       
       
    while(v !=-1){
            rev
    [count ++]= v;
            v
    = path[v];    
       
    }

       
    for(i = count -1; i >=0; i--){
           
    if(i == count -1){
                printf
    ("%d", rev[i]);
           
    }
           
    else{
                printf
    ("->%d", rev[i]);
           
    }
       
    }
    }

    int main(){
       
    int i, j;
       
    int u, v, w;
        scanf
    ("%d",&N);
        memset
    (matrix,0,sizeof(matrix));
       
    while(1){
            scanf
    ("%d%d%d",&u,&v,&w);    
           
    if(u ==-1&& v ==-1&& w ==-1){
               
    break;    
           
    }
            matrix
    [u][v]= w;
       
    }
       
    for(i =0; i < N; i++){
           
    for(j =0; j < N; j++){
               
    if(i == j){
                    matrix
    [i][j]=0;    
               
    }      
               
    elseif(matrix[i][j]==0){
                    matrix
    [i][j]= INF;
               
    }
           
    }    
       
    }
        dijkstra
    (0);
       
    for(i =1; i < N; i++){
            printf
    ("%d-->%d:%d ",0, i, dist[i]);    
            print_path
    (i);
            printf
    (" ");
       
    }
       
    return0;    
    }
  • 相关阅读:
    jQuery Ajax 实例 全解析
    简易的AJAX工具[转]
    一些JSON 教程
    写一个ajax程序就是如此简单
    ecshop中ajax的调用原理 1
    ECSHOP中ajax的调用原理
    ul中li分列显示
    PHP serialize & JSON 解析
    c++字符集之间转换(UTF-8,UNICODE,Gb2312)
    各种字符集和编码直接的联系详解
  • 原文地址:https://www.cnblogs.com/igloo1986/p/3517810.html
Copyright © 2020-2023  润新知