题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2544
己思:
纯最短路算法题,最近刚自学Dijkstra算法,虽然之前数据结构有教,但都没去听,如果有和我一样是新手的Acmer,可以靠图解理解这一算法,最好自己在纸上当数学题演算一番,http://wenku.baidu.com/view/060d9127bcd126fff7050b82.html (里面有图解),然后再看代码,就豁然开朗了。
Dijkstra算法:
void Dijkstra(){
int k;
for(int i=1;i<=n;i++)
dis[i] = map[1][i];
for(int i=1;i<n;i++){
int tmin = maxint;
for(int j=1;j<=n;j++)
if( !used[j] && tmin > dis[j] ){
tmin = dis[j];
k = j;
}
used[k] = 1;
for(int j=1;j<=n;j++)
if( dis[k] + map[k][j] < dis[j] )
dis[j] = dis[k] + map[k][j];
}
printf("%d",dis[n]);
} /* 求1到N的最短路,dis[i] 表示第i个点到第一个点的最短路*/
代码:
#include<stdio.h>
#define Max 100000000;
int N,M;
int map[110][110];//i路口到j路口的路径长度
int mark[110];//标记是否i路口是否已找到最短路径
int dij[110];//i路口到起点的路径长度
void init()
{
int i,j;
for(i=1;i<=N;i++)
{
mark[i]=0;//初始化为未找到最短路径
for(j=1;j<=N;j++)
{
map[i][j]=i==j?0:Max; //初始化为路口之间都不相连,自己到自己当然是0了
}
}
for(i=1;i<=M;i++)
{
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
if(time<map[a][b])//如果路口之间有多条路,取最小值
map[a][b]=map[b][a]=time;
}
}
int Dijstra(int n)
{
int i,j;
mark[1]=1;
for(i=1;i<=n;i++)//进入主循环前,初始化起始点。
{
dij[i]=map[1][i];
}
int min,d;
for(i=1;i<n;i++)//主循环
{
min=Max;
for(j=1;j<=n;j++)
{
if(!mark[j]&&dij[j]<min)
{
min=dij[j];
d=j;
}
}
mark[d]=1;
for(j=1;j<=n;j++)
{
if(!mark[j]&&dij[d]+map[d][j]<dij[j])
{
dij[j]=dij[d]+map[d][j];
}
}
}
return dij[n];
}
int main()
{
while(scanf("%d%d",&N,&M),N+M)
{
init();
printf("%d\n",Dijstra(N));
}
return 0;
}