题目链接:                               http://acm.hdu.edu.cn/showproblem.php?pid=2544

 

这一题与上面一题hdu2112大有相似之处,都是用了dijkstra算法,重要点依然是对dijkstra更新过程的理解:也就是对

for(i=0;i<n;i++)

{

  if(flag[j]==0&&count[j]>count[k]+map[k][j]);

                 count[j]=count[k]+map[k][j];

}     

的理解,在这里map[][],是以二维数组形式记录了任意2点之间的距离,对于2点无法连通的我们初始化为一个较大的数(这里选了1000000000);

    count[j]=count[k]+map[k][j];大意就是如果存在一个点能使从点1到点k再到点j比从点1直接到点j的路程小,我们就把从点1到点j的距离记为从点1到点k再到点j的距离:

此题代码如下:

View Code
# include<stdio.h>
# include<string.h>
int count[120];
int map[120][120];
int flag[120];
int n;
int dijkstra(int num)//这样的要用dijkstra算法了,
{
int i,j,k,min;
for(i=1;i<=n;i++)
{
flag[i]=0;
count[i]=map[num][i];
}
flag[num]=1;
count[num]=0;
for(i=1;i<=n;i++)//值得注意的是要从1开始了
{
min=1000000000;
for(j=1;j<=n;j++)
{
if(flag[j]==0&&count[j]<min)
{
min=count[j];
k=j;
}
}
flag[k]=1;
for(j=1;j<=n;j++) ////这更新过程要仔细理解
{
if(flag[j]==0&&count[j]>count[k]+map[k][j])
count[j]=count[k]+map[k][j];
}
}
return count[n];///这个走法便是从1走到n所以返回的是到n时的值;
}
int main()
{
int i,j,m,a,b,c,d;
while(scanf("%d%d",&n,&m),n||m)
{
for(i=1;i<120;i++)
for(j=1;j<120;j++)
map[i][j]=1000000000;///这个数要比在题中所给的最坏情况即最大结果还要大方可
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=c;
if(map[b][a]>c)
map[b][a]=c;
}
if(n==1)
printf("0\n");
else
{
d=dijkstra(1);
printf("%d\n",d);
}
}
return 0;
}

  

posted on 2011-08-10 08:32  world_ding  阅读(271)  评论(0编辑  收藏  举报