hdu 2544 最短路(最短路第一弹)

来源:互联网 发布:达芬奇调色 mac 编辑:程序博客网 时间:2024/06/11 01:11

hdu  2544  最短路            题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

图论  Dijstra(迪杰斯特拉)

题目分析:求最短路,迪杰斯特拉算法是贪心、BFS思想,走每个点时找能走的点中最短的路径(直接或间接),并更新结果数组。

code:

#include<stdio.h>#include<string.h>#define INF 100000099int 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