单源最短路HDU2544

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define MAX 100000
using namespace std;
int n,m   ,i,j;             //n代表要从1到n,m代表路径的数量 

int map[1001][1001];        //map[i][j]代表从i到j的权值 
int d[1001];                //d[i]代表从1到i的最短通路的长度 
void dijk()
{
    int fg[1001]= {0};
    memset(fg,0,sizeof(fg));
            //标志变量的数组一定要清零 
    for(i=1; i<=n; i++) {
       d[i]=map[1][i];              //初始化d[i] 
    }fg[1]=1;d[1]=0;

    for(i=1; i<n; i++) {
       int findmin=MAX,pos=1;

       for(j=1; j<=n; j++) {        //找到目前点离所有未标记点的路径的最小值,记录位置并标记 
          if(!fg[j]&&(d[j]<findmin)) {
             findmin=d[j];
             pos=j;
          }
       }
       fg[pos]=1;

       //更新d[j] 
       for(j=1; j<=n; j++) {
          if(!fg[j]) {
             d[j]=min(d[j],d[pos]+map[pos][j]);
          }
       }

    }

}
int main()
{
    int a,b,c;
    while(scanf("%d %d",&n,&m),n||m) {

       for(i=0; i<=1000; i++) {
          for(j=0; j<=i; j++) {
             map[i][j]=map[j][i]=MAX;       //先将所有的路径赋值为无穷 
          }
       }
       for(i=1; i<=m; i++) {
          scanf("%d %d %d",&a,&b,&c);
          map[a][b]=map[b][a]=c;            //从a到b的权值为c 
       }
       dijk();
       printf("%d\n",d[n]);
    }
    return 0;
}









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值