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 }

 

转载于:https://www.cnblogs.com/accipiter/archive/2013/01/21/2870619.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值