Dijkstra求最短路的条数,并输出最短路径和最短路经过的点的最大和
来源:互联网 发布:websocketserver java 编辑:程序博客网 时间:2024/06/05 02:08
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include <stack>using namespace std;const int maxn=1e3;const int INF=1e8;int n,m,st,en,x,y,z;int val[maxn],valsum[maxn],path[maxn],pathsum[maxn];//val储存每个点的值,valsum储存到点【i】前的点值和,path储存点【i】前那个点的号,pathsum储存到点【i】的最短路的条数int d[maxn],vis[maxn],G[maxn][maxn];void dijkstra(){ for(int i=0;i<n;i++) d[i]=G[st][i]; d[st]=0; pathsum[st]=1;//初始化起点的最短路的条数是1 int min1,p; for(int i=1; i<=n; i++) { min1=INF; for(int j=0; j<n; j++) { if(!vis[j] && d[j]<min1) { min1=d[j]; p=j; } } vis[p]=1; for(int j=0; j<n; j++) { if(!vis[j] && d[j]>d[p]+G[p][j]) { d[j]=d[p]+G[p][j]; pathsum[j]=pathsum[p];//当松弛时,到【j】和到【p】的最短路的条数相同 valsum[j]=valsum[p]+val[j];//松弛时直接加上更新后的点值 path[j]=p;//记录上一个点 } else if(!vis[j] && d[j]==d[p]+G[p][j]) { pathsum[j]+=pathsum[p];//当相等时,到【j】的加上到【p】的 if(valsum[j]<valsum[p]+val[j]) { valsum[j]=valsum[p]+val[j];//当相等时加上大的那个 path[j]=p;//相等时记录大的那个点 } } } }}void P()//输出路径{ int tmp; stack<int>si; while(!si.empty()) si.pop(); si.push(en);//从最后的那个点开始逆序存到堆栈里 while (st!=en) { tmp=path[en]; si.push(tmp); en=tmp; } cout << si.top(); si.pop(); while(!si.empty()) { cout << ' ' << si.top(); si.pop(); } cout << endl;}void inition(){ memset(path,0,sizeof(path)); memset(vis,0,sizeof(vis)); memset(pathsum,0,sizeof(pathsum)); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(i==j) G[i][j]=0; else G[i][j]=INF; } valsum[i]=val[i]; }}int main(){ scanf("%d%d%d%d",&n,&m,&st,&en); for(int i=0; i<n; i++) scanf("%d",&val[i]); inition(); for(int i=1; i<=m; i++) {scanf("%d%d%d",&x,&y,&z);G[x][y]=z;G[y][x]=z;}//无向图 dijkstra(); printf("%d %d\n",pathsum[en],valsum[en]); P(); return 0;}
阅读全文
0 0
- Dijkstra求最短路的条数,并输出最短路径和最短路经过的点的最大和
- 求经过路径最少的最短路
- 路数有限制(w的倍数)的最短路,【二维dijkstra】 双重限制并输出路径和方法数
- 求最短路条数之类的~~~
- 优先队列优化的求最短路和次短路条数以及长度的模板
- Dijkstra-路径还原 输出最短路的路径
- Floyd和Dijkstra的最短路
- dijkstra求最短路并记录路径
- sdut 2622 最短路径(Dijkstra算法求最短路)
- 最短路径(最基础,经典的模板和思想):HDU-2544最短路
- A - 最简单的最短路 -最短路径
- POJ 3463 Sightseeing Dijkstra最短路&最短路-1的路径数(计数)
- poj3463 最短路和比最短路长1的路径数
- 最短路 dijkstra 权值非负的单源最短路径
- 最短路和次短路条数
- poj 3463 dijkstra变形(求最短路和次短路的数量)
- pku3463求最短路和路径长度比其小一的总方法数
- hdu 3790 最短路径问题(多权值的最短路)
- MySQL主从复制
- 致JAVA编程的初学者,环境变量的相关问题。
- Linux入门基本指令
- ROS学习笔记(一)
- Spring——AOP拦截Controller将异常信息抛给浏览器
- Dijkstra求最短路的条数,并输出最短路径和最短路经过的点的最大和
- 十一、文件系统
- 稀疏矩阵三元组表示法的倒置
- 一个有意思的Canvas绘图
- 工作三年了-我的2015至2016-浙大研究院
- JavaScript 23 轮播效果
- redis安装
- Filter过滤器
- ECharts相关小结