题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2544
基础最短路,直接用迪杰斯特拉即可(注意会输入重边).
#include<stdio.h>
#define MAX 0x3fffffff
int map[105][105],dis[105];
bool use[105];
int n,m;
void dijk(int start)
{
int min,rj,i,j;
for(j=1;j<=n;j++)
dis[j]=MAX,use[j]=0;
dis[1]=0;
for(i=1;i<=n;i++)
{
min=MAX;
for(j=1;j<=n;j++)
if(!use[j]&&dis[j]<min)
min=dis[j],rj=j;
use[rj]=1;
for(j=1;j<=n;j++)
if(dis[j]>dis[rj]+map[rj][j])
dis[j]=dis[rj]+map[rj][j];
}
}
int main()
{
int i,j,a,b,temp;
while(scanf("%d%d",&n,&m),n||m)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[j][i]=map[i][j]=MAX;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
scanf("%d",&temp);
if(temp<map[a][b])
map[b][a]=map[a][b]=temp;
}
dijk(1);
printf("%d\n",dis[n]);
}
}