• C语言dijkstra算法求最小路径


      两天没传东西了,有点罪恶感。今天看了些密码学的东西,发现那东西,说复杂也确实是,说简单好像也挺简单,主要也就是与、或、非、异或等各种变换。等有时间了自己好好写写。

      先说说,今天写的最短路径,也就是搜索,先小区域找,滚雪球,再找,确定最小的。OK!理解思想了,程序也就好说了。上代码:

     1 /*dijkstra算法*/
     2 #include <stdio.h>
     3 
     4 #define MAXNODE 30
     5 #define MAXCOST 1000
     6 int dist[MAXNODE];
     7 int cost[MAXNODE][MAXNODE];
     8 int n=5;
     9 void dijkstra(int vbegin);
    10 void display(int vbegin);
    11 int main()
    12 {
    13     int i,j,vbegin=1;
    14     for(i=1;i<=n;i++)
    15     {
    16         for(j=1;j<=n;j++)
    17         {
    18             cost[i][j]=MAXCOST;
    19         }
    20     }
    21     /*到自己处为0*/
    22     for(i=1;i<=n;i++)
    23     {
    24         cost[i][i]=0;
    25     }
    26     cost[1][2] = 10;
    27     cost[1][5] = 100;
    28     cost[1][4] = 30;
    29     cost[2][3] = 50;
    30     cost[3][5] = 80;
    31     cost[4][3] = 20;
    32     cost[4][5] = 60;
    33     dijkstra(3);
    34     display(3);
    35     return 0;
    36 }
    37 void dijkstra(int vbegin)
    38 {
    39     int flag[MAXNODE];//访问标示,0-未访问,1-访问
    40     int mindis,dis,i,j,u;
    41     /*初始化*/
    42     for(i = 1;i<=n;i++)
    43     {
    44         dist[i] = cost[vbegin][i];/*给路径赋值*/
    45         flag[i] = 0;
    46     }
    47     flag[vbegin] = 1;
    48     
    49     /*求最短路径*/
    50     for(i=1;i<=n;i++)
    51     {
    52         mindis = MAXCOST;/*最段路径设为最大*/
    53         /*处理单节点*/
    54         for(j = 1;j <= n;j++)
    55         {
    56             if(flag[j] == 0&& dist[j] < mindis)
    57             {
    58                 u = j;
    59                 mindis = dist[j];
    60             }
    61         }
    62         flag[u] = 1; 
    63         /*处理节点到达的问题*/
    64         for(j=1;j<=n;j++)
    65         {
    66             if(flag[j] == 0)
    67             {
    68                 dis = dist[u]+cost[u][j];/*多个节点组合路径*/
    69                 dist[j] = (dist[j]<dis)?dist[j]:dis;
    70             }
    71         }
    72     }
    73 }
    74 void display(int vbegin)
    75 {
    76     int i;
    77     printf("\nnode %dto every node the shortest path:\n",vbegin);
    78     for(i=1;i<=n;i++)
    79     {
    80         printf("v%d->v%d:",vbegin,i);
    81         if(dist[i] == MAXCOST)
    82         {
    83             printf("no road!\n");
    84         }
    85         else
    86         {
    87             printf("%d\n",dist[i]);
    88         }
    89     }
    90 }
  • 相关阅读:
    [二分][dp] Jzoj P3463 军训
    [树状数组] Jzoj P3462 休息
    [期望] Jzoj P3459 TheSwaps
    [dp] Jzoj P3460 Mixing Chemicals
    [数位dp][状压dp] Jzoj P3458 密码
    [匈牙利] Jzoj P1156 使命的召唤
    [bfs][状压] Jzoj P2121 分球
    [dp] Jzoj P1187 最大公共子串
    [树套树] Jzoj P5699 【gdoi2018 day1】涛涛接苹果
    [枚举] Jzoj P3387 终极武器
  • 原文地址:https://www.cnblogs.com/accipiter/p/2870619.html
Copyright © 2020-2023  润新知