链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
这种模板题我都做了3遍了,这下应该会了吧,下次希望不会忘记
迪杰斯特拉算法
每次去出最小的权值
赋值给x,然后去做处理
f[i]=max[f[i],f[x]+map[x][j]];
每次x要记忆化一下,用过就不能再用了
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define maxn 0xfffffff
int min(int a,int b)
{
return a>b?b:a;
}
int road[105];
int map[105][105];
int sign[105];
int main()
{
int a,b,c,n,m,x,y,i,j;
while(scanf("%d%d",&m,&n),m|n)
{
for(i=0;i<105;i++)
for(j=0;j<105;j++)
map[i][j]=maxn;
for(i=0;i<105;i++)
map[i][i]=0;
for(i=0;i<105;i++)
road[i]=maxn;
road[0]=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a-1][b-1]=map[b-1][a-1]=c;
}
memset(sign,0,sizeof(sign));
for(i=0;i<m;i++)
{
int max=maxn;
for(j=0;j<m;j++)
if(!sign[j]&&road[j]<=max)
max=road[j],x=j;
sign[x]=1;
for(j=0;j<m;j++)
road[j]=min(road[j],road[x]+map[x][j]);
}
printf("%d\n",road[m-1]);
}
}