hdu 2544 最短路 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
图论 Dijstra(迪杰斯特拉)
题目分析:求最短路,迪杰斯特拉算法是贪心、BFS思想,走每个点时找能走的点中最短的路径(直接或间接),并更新结果数组。
code:
#include<stdio.h>
#include<string.h>
#define INF 100000099
int map[110][110],dis[110],m,n;
void dijstra(int sourse,int n)
{
int vis[110],k,l,sta=sourse;
for(k=0;k<n;k++)
{
dis[k]=map[sta][k];
vis[k]=0;
//printf("dis[%d]==%d\n",k,dis[k]);
}
vis[sta]=1;
for(k=1;k<n;k++)
{
int mark=sta,temp=INF;
for(l=1;l<n;l++)
{
if(!vis[l]&&sta!=l)
{
if(map[sta][l]<INF&&dis[l]>dis[sta]+map[sta][l])
{//这里开始写成map[sta][l]!=0,忘了初始化成INF了
dis[l]=dis[sta]+map[sta][l];
}
if(dis[l]<temp)
{
temp=dis[l];
mark=l;
}
}
}
if(temp==0||temp==INF)break;
sta=mark;
vis[mark]=1;
}
}
int main()
{
int a,b,c,i,j;
while(scanf("%d%d",&m,&n)!=EOF&&m|n)
{
memset(map,INF,sizeof(map));
memset(dis,INF,sizeof(dis));
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<map[a-1][b-1])
map[a-1][b-1]=map[b-1][a-1]=c;//因为是无向图
}
dijstra(0,m);
printf("%d\n",dis[m-1]);
}
return 0;
}
PS:最短路第一弹,迪杰斯特拉算法……弄了狠长时间啊~
PSS:一个学习笔记 http://hi.baidu.com/iohwwoilrrbcdld/item/9fee76319c62684a3175a147