1.题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2544
2.思路:
我是用floyd算法去求的。具体看代码。
3.参考代码:
#include <stdio.h>
#include <string.h>
#define inf 0xffff
int n,m; ///n为点数,m为边数
int dis[1100][1100]; ///存放距离的数组
void floyd(){ ///floyd算法
int i,j,k; ///循环变量
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][k]+dis[k][j]) ///判断
dis[i][j]=dis[i][k]+dis[k][j]; ///更新距离
}
}
}
}
int main()
{
int i,j; ///循环变量
int u,v,w; ///两个商店以及它们之间的距离
while(scanf("%d %d",&n,&m) && (n || m))
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j) ///本身到本身的距离为0
dis[i][j]=0;
else ///其他的都初始化为无穷大,即最开始都是单独的点
dis[i][j]=dis[j][i]=inf;
}
}
while(m--)
{
scanf("%d %d %d",&u,&v,&w);
if(dis[u][v]>w) ///比较
dis[u][v]=dis[v][u]=w;
}
floyd();
printf("%d\n",dis[1][n]); ///输出起点到终点的最短距离
}
return 0;
}