博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[算法] dijkstra单源无负权最小路径算法
阅读量:7062 次
发布时间:2019-06-28

本文共 2195 字,大约阅读时间需要 7 分钟。

#include 
#include
#include
#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\t",0, i, dist[i]);             print_path(i);         printf("\n");     }     return0;     }

转载于:https://www.cnblogs.com/igloo1986/p/3517810.html

你可能感兴趣的文章
linux下进度条的简单实现
查看>>
我的友情链接
查看>>
Android项目中引用外部项目library失败的原因
查看>>
线性回归原理和实现基本认识
查看>>
类的生命周期
查看>>
Docker 入门及安装[Docker 系列-1]
查看>>
java中使用反射获取pojo(实体)类的所有字段值
查看>>
Linux - 常用参考资料(持续更新)
查看>>
运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本
查看>>
Linux - tar命令详解
查看>>
DFA和NFA
查看>>
NTP常见问题和解决方案&配置文件详解
查看>>
XmlParser和HtmlParser
查看>>
smartsvn学习(二)如何在Xcode下使用SVN
查看>>
我的友情链接
查看>>
二维条码防伪封签是怎样进行防伪的
查看>>
今天,让Mac更好用!
查看>>
EXCHANGE 备忘
查看>>
教你深入系统的学习linux系统
查看>>
前台向后台隐藏传参数
查看>>