hdu1874 最短路径 畅通工程续
来源:互联网 发布:管理系统制作软件 编辑:程序博客网 时间:2024/05/29 16:56
迪杰斯特拉Dijkstra 单源最短路径
解题思路:
寻求起点到其余每个点的最短距离
1.给定一个集合S,初始化只包含起点,S={v0},另一个集合U={其他定点},两点是邻接点,有权值,不是,则权值记为无穷大。
找v0到其他点的最短距离,标记之,极为k。
2.通过循环,判断v0经过k点到其他点的距离是否小于没有经过k点的距离,若小于,更新当前v0到其他点的距离
找下一个未标记的点,且v0到它的距离最短,标记之,记为K,重复2.
最终所有点都被标记,循环结束。
有一个实例:
#include<iostream>using namespace std;const int maxnum=1005;const int maxint=99999;int dist[maxnum];//起点到终点的距离int c[maxnum][maxnum];//用于储存两点之间的距离void Dijkstra(int S,int N,int * dist,int c[maxnum][maxnum]){ bool s[maxnum];//判断是否已加入集合S中 //初始化起始点到其他点的距离 for(int i=0;i<N;i++) { dist[i]=c[S][i]; s[i]=0; } //起始点被标记,最短距离为0 s[S]=1; dist[S]=0; //遍历剩下n-1个点 for(int i=1;i<N;i++) { int u=S; int temp=maxint; //找出尚未标记的点中,与起始点距离最短的 for(int j=0;j<N;j++) if(!s[j]&&dist[j]<temp) { u=j; temp=dist[j]; } s[u]=1; //最难理解的地方:找到当前已于起始点联通的点的最短距离,随着每一次遍历,会更新,最终达到最短 for(int k=0;k<N;k++) if(!s[k]&&dist[k]>dist[u]+c[u][k]) { dist[k]=dist[u]+c[u][k]; } }}int main (){ int N,M; while(cin>>N>>M) { int A,B,X; for(int i=0;i<N;i++) for(int j=0;j<N;j++) c[i][j]=maxint; for(int i=1; i<=N; ++i) dist[i] = maxint; for(int i=0;i<M;i++) { cin>>A>>B>>X; if(X<c[A][B]) { c[A][B]=X; c[B][A]=X; } } int S,E; cin>>S>>E; Dijkstra(S,N,dist,c); if(dist[E]==maxint) cout<<"-1"<<endl; else cout<<dist[E]<<endl; } return 0;}
0 0
- hdu1874 最短路径 畅通工程续
- Hdu1874 最短路径_畅通工程续
- hdu1874——畅通工程续(最短路径)
- HDU1874畅通工程续(最短路径)
- 畅通工程续 最短路径 Dijkstra
- 畅通工程续(最短路径)
- 畅通工程续 最短路径问题
- 【最短路径】畅通工程续
- HDU1874 畅通工程续 单源最短路径
- hdu1874 畅通工程续(求最短路径)
- hdu1874 畅通工程续--单源最短路径
- hdu1874-畅通工程续(最短路)
- hdu1874 畅通工程续 (最短路)
- HDU1874--畅通工程续--最短路
- 畅通工程续(hdu1874,floyd最短路)
- hdu1874 畅通工程续 最短路
- hdu1874 畅通工程续 最短路
- hdu1874 畅通工程续(单元最短路)
- 清除当前目录下的SVN文件批处理
- hdu 3782 xxx定律
- 类、对象、指针试题
- onclick="" 和 $('').click() 什么区别:onclick是javascript,$().click是jquery
- Linux 下安装配置tomcat
- hdu1874 最短路径 畅通工程续
- ListView回收机制相关分析
- du 命令技巧
- 26_保存文件到SD卡
- VS2012 中 c++项目中的各个选项介绍
- SRM 628 D1L3:DoraemonPuzzleGame,math,期望,dp
- Oracle字符串如何连接单引号
- 路径中 斜杠/和反斜杠\ 的区别
- 8大排序算法图文讲解