题意:给定一个图,以及起点和终点,需要我们计算两条路径。第1条路径:距离最短路径,若不唯一,则选择用时最短的那一条;第2条路径:用时最少路径,若不唯一,选择经过结点数最少的那一条。
思路:两次Dijkstra即可。以往都是求一条路径,本题要求两条,没什么不同,只是代码量多了一些。编写代码前要心中有数,变量名怎么命名等等(变量名一多,命名真是件举棋不定的事。。)
第1条路径:第1标尺为距离,第2标尺为用时,在Dijkstra中完成更新。用pre[v]记录结点v的前驱,在Dijkstra之后用DFS把路径提取出来即可。
第2条路径:第1标尺为用时,第2标尺为整条路径所经过的结点数,也可以在Dijkstra中完成更新。其他操作都是一模一样的。
#include#include #include using namespace std;const int Inf=0x7fffffff;const int N=505;struct Node{ int v; int length,time; Node(int v_,int len_,int t_):v(v_),length(len_),time(t_){}};int n,m,s,e;//结点个数,边数,起点,终点vector Adj[N];bool vis[N];vector pre[N];//dis[v]记录起点s到结点v的最短距离(第1标尺),cost[v]记录起点s到结点v的最快时间(第2标尺)int dis[N];int cost[N];//time[v]记录起点s到结点v的最快时间(第1标尺),num[v]记录起点s到结点v的最少结点数(第2标尺)int time[N];int num[N];void Dijkstra_length(int s){ fill(vis,vis+N,false); fill(dis,dis+N,Inf); dis[s]=0; fill(cost,cost+N,Inf); cost[s]=0; for(int i=0;i