hdu_2544 最短路
2013-08-02 20:14
274 查看
原题链接: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数组中九存放着从源点到个点的最短路径。
我的代码:
总结:用dijstra求最短路径。关于最短路径,又研究了一个下午-,-还是有点收获的。。
分析:最短路径的入门题,主要理解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 120 int 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 ); } return 0; }
总结:用dijstra求最短路径。关于最短路径,又研究了一个下午-,-还是有点收获的。。
相关文章推荐
- HDU 2544 最短路重刷,四种算法
- hdu 2544 最短路(Dijkstra模板)
- 最短路------HDU2544
- HDU 2544 单源最短路
- 【最短路模板】HDU 2544
- HDU 2544 最短路
- HDU 2544 最短路 单源Dijkstra
- HDU 2544 最短路——dijlstra
- [2544]最短路 (两种算法)(HDU)
- hdu 2544 最短路 (dij)
- hdu 2544 最短路
- HDU_2544_最短路
- 最短路 SPFA 判断负环 静态邻接表(链式前向星) HDU 2544 最短路 POJ 3259 Wormholes
- hdu 2544 最短路 A
- HDU 2544 最短路
- hdu 2544 最短路(c && java)
- HDU 2544 最短路 【最短路入门模板题】
- [hdu 2544] 最短路(SPFA版)
- HDU 2544 最短路 -- floyd
- HDU 2544 最短路