hdu_2544 最短路
来源:互联网 发布:国信期货软件 编辑:程序博客网 时间:2024/06/14 01:35
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
分析:最短路径的入门题,主要理解dijstra算法中dis[i](从源点到i点的最短路径)的更新。还要用到S集合(已找过的点)和G(总的点),G-S(未找的点)。
主要分三步来更新dis数组:
1、在S集合中找一个到G-S集合中的点最近的点D。
2、D点能到的点为K点,更新dis[K]的值。
3、将D点放进S集合,当所有点都在S集合时,dis数组中九存放着从源点到个点的最短路径。
我的代码:
#include<stdio.h>#include<string.h>using namespace std;#define INF 0xffffff#define MAXN 120int map[MAXN][MAXN];int dis[MAXN];int mark[MAXN];void init(int n){ int i,j; for( i=1;i<=n;i++) for(j=1;j<=n;j++) map[i][j]=INF;}int Min(int a,int b){ return a<b?a:b;}void dijstra(int n,int s){ for(int i=1;i<=n;i++) { dis[i]=map[s][i]; //初始化dis[]数组。 mark[i]=0; } dis[s]=0; mark[s]=1; for(int i=1;i<=n;i++) //每次加一个点,要加的点数。 { int k,min=INF; for(int j=1;j<=n;j++) //找到不在S集合点,且S集合的点到其他集合点的最小值。 { if(!mark[j]&&dis[j]<min) { min=dis[j]; k=j; } } if(min==INF) break;//即所有点都在S集合里了。 mark[k]=1; for(int j=1;j<=n;j++) { if(!mark[j]&& map[k][j]!=INF) //map[u][j],要是连通的。 { dis[j]=Min(dis[j],dis[k]+map[k][j]); } } }}int main(){ int i,n,m; while(scanf("%d%d",&n,&m)==2&&(n+m)) { init(n); for(i=0;i<m;i++) //输入图。 { int a,b,t; scanf("%d%d%d",&a,&b,&t); map[a][b]=t; map[b][a]=t; } dijstra( n,1); printf("%d\n",dis[n]); } return 0;}
总结:用dijstra求最短路径。关于最短路径,又研究了一个下午-,-还是有点收获的。。
- hdu_2544 最短路
- hdu_2544 最短路
- hdu_2544 最短路 (floyd算法)
- hdu_2544
- hdu_2544
- 最短路 & 次短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- Hibernate+Struts2实现简单登录注册
- Aozi 奥姿 2012夏装休闲花色荷叶边高腰裙超长吊带裙
- Sublime Text 2使用
- 25岁生日来临 乱谈一下人生
- 杭电4540-威威猫系列故事——打地鼠
- hdu_2544 最短路
- android 缓存管理及LRU算法
- HDU Dividing
- UVA 424 (大树相加 13.08.02)
- Unable to open file 'lnk51ew_cc2530b.xcl'的解决方案
- LeetCode:Permutation Sequence
- Qt 产生随机数
- c++小结
- IBM