dijkstra算法 最短路径 hdu2544

模板引用 http://www.cnblogs.com/mycapple/archive/2012/08/21/2649274.html

这个算法离散课张院长讲过 不过那个时候只是讲了算法的实现
并没有讲代码 不过算法的过程弄懂了 代码琢磨一下就弄懂了 就这样。

算法显示看别人的A的代码的 然后自己琢磨 能够自己打出来了
然后自己打出来 能A了。 。。。
下面是代码加自己写的注释。。。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 0x3f3f3f3f


 int m[10010][10010],p[10010]; // p是原点到各点最短路径数组
 bool vis[10010]; // 标记数组
 int vexnum,arcnum; // 点 边 
 void dijstra()
 {

     int i,k,t,min;
     memset(vis,0,sizeof(vis)); // 清空
     for(i=1;i<=vexnum;++i)
         p[i]=m[1][i]; // p数组存储 1 到所有点的距离  // 也可以改成0 自定义

     for(vis[1]=k=1;k<vexnum;++k)
     {
         for(min=Max ,i=1;i<=vexnum;++i)
         {        
                              // p[i]里面是存放原点到各点的最小值的 就是每一行的最小值 如果没有被标记 而且是这一行最小的 就放进去
            if(!vis[i]&&min>p[i]) // 如果这个数字已经在标记的数组里面了 那么 跳过  如果这个数字没被标记 且是目前中这一行已遍历最小的 那么放进数组里面去 
             {
                 min=p[i];
                 t=i; 
             }
         }
         vis[t]=1;// 最后才标记位置 (最终的)

             for(i=1;i<=vexnum;++i)
             {
               if(!vis[i]&&p[i]>min+m[t][i])  // 比较 1 到 i 和 1 到t + t到i 哪个更近一点 
                     p[i]=min+m[t][i]; 
             }

     }
 }
 int main()
 {
     int i,j,a,b,w;
     while(~scanf("%d%d",&vexnum,&arcnum),vexnum||arcnum)// 输入点 边 
     {
         for(i=1;i<=vexnum;++i) 
             for(j=1;j<=vexnum;++j)
                 m[i][j]=m[j][i]=Max;// 各点重置为无穷 
         for(i=0;i<arcnum;++i){
             scanf("%d%d%d",&a,&b,&w); // a 到 b点的距离 
             m[a][b]=m[b][a]=w; // 赋值
         }


         dijstra();
         printf("%d\n",p[vexnum]);
     }
//
     // system("pause");
     return 0;
 }          

以上~ 滚去看另一个算法了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值