您的位置:首页 > 其它

hdu_2544 最短路

2013-08-02 20:14 274 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

分析:最短路径的入门题,主要理解dijstra算法中dis[i](从源点到i点的最短路径)的更新。还要用到S集合(已找过的点)和G(总的点),G-S(未找的点)。

           主要分三步来更新dis数组:

           1、在S集合中找一个到G-S集合中的点最近的点D。

           2、D点能到的点为K点,更新dis[K]的值。

           3、将D点放进S集合,当所有点都在S集合时,dis数组中九存放着从源点到个点的最短路径。

我的代码:

#include<stdio.h>
#include<string.h>
using namespace std;
#define INF 0xffffff
#define MAXN 120
int map[MAXN][MAXN];
int dis[MAXN];
int mark[MAXN];
void init(int n)
{
int i,j;
for( i=1;i<=n;i++)
for(j=1;j<=n;j++) map[i][j]=INF;

}
int Min(int a,int b)
{
return a<b?a:b;
}

void dijstra(int n,int s)
{
for(int i=1;i<=n;i++)
{
dis[i]=map[s][i];  //初始化dis[]数组。
mark[i]=0;
}
dis[s]=0;
mark[s]=1;
for(int i=1;i<=n;i++)  //每次加一个点,要加的点数。
{
int k,min=INF;
for(int j=1;j<=n;j++) //找到不在S集合点,且S集合的点到其他集合点的最小值。
{
if(!mark[j]&&dis[j]<min)
{
min=dis[j];
k=j;
}
}
if(min==INF) break;//即所有点都在S集合里了。
mark[k]=1;
for(int j=1;j<=n;j++)
{
if(!mark[j]&& map[k][j]!=INF) //map[u][j],要是连通的。
{
dis[j]=Min(dis[j],dis[k]+map[k][j]);
}
}
}

}
int main()
{
int  i,n,m;
while(scanf("%d%d",&n,&m)==2&&(n+m))
{
init(n);
for(i=0;i<m;i++)  //输入图。
{
int a,b,t;
scanf("%d%d%d",&a,&b,&t);
map[a][b]=t;
map[b][a]=t;
}
dijstra( n,1);
printf("%d\n",dis
);
}
return 0;
}


总结:用dijstra求最短路径。关于最短路径,又研究了一个下午-,-还是有点收获的。。

           
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: