http://www.cnblogs.com/wally/archive/2013/04/16/3024490.html

http://blog.csdn.net/me4546/article/details/6584448

维护最短路长度d[i][0]和次短路d[i][1],最短路条数dp[i][0]和次短路dp[i][1]

  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <stack>
  9. #include <queue>
  10. #include <cctype>
  11. #include <vector>
  12. #include <iterator>
  13. #include <set>
  14. #include <map>
  15. #include <sstream>
  16. using namespace std;
  17.  
  18. #define mem(a,b) memset(a,b,sizeof(a))
  19. #define pf printf
  20. #define sf scanf
  21. #define spf sprintf
  22. #define pb push_back
  23. #define debug printf("!\n")
  24. #define MAXN 5010
  25. #define MAX(a,b) a>b?a:b
  26. #define blank pf("\n")
  27. #define LL long long
  28. #define ALL(x) x.begin(),x.end()
  29. #define INS(x) inserter(x,x.begin())
  30. #define pqueue priority_queue
  31. #define INF 0x3f3f3f3f
  32.  
  33. struct Edge
  34. {
  35. int v,w;
  36. };
  37. vector<Edge> g[];
  38. struct node
  39. {
  40. int v,dist;
  41. int mark;//标记,0为最短路,1为次短路;
  42. bool operator < (const node &p) const
  43. {
  44. if(p.dist != dist)
  45. return p.dist<dist;
  46.  
  47. return p.v<v;//这儿如果不按顶点的大小排序,就wa了。
  48. }
  49. };
  50.  
  51. int n,m,s,e;
  52. int dist[][];
  53. int dp[][];
  54. bool vis[][];
  55. //dp[i][0]表示到达点i最短的路有多少条,dp[i][1]表示次短的条数
  56. //dist[i][0]表示到达点i最短路的长度,dist[i][1]表示次短路的长度
  57. /*
  58. 用v去松驰u时有四种情况 (设当前dist[v][cas])
  59. 情况1:dist[v][cas]+w(v,u)<dist[u][0],找到一个更短的距离,则把原来最短的距离作为次短的距离,同时更新最短的.即
  60. dist[u][1]=dist[u][0]
  61. dist[u][0]=dist[v][cas]+w(v,u);
  62. dp[u][1]=dp[u][0]
  63. dp[u][0]=dp[v][cas],
  64. 把node(dist[u][0],u,0)和node(dist[u][1],u,1)放入队列
  65. 情况2:dist[v][cas]+w(v,u)==dist[u][0],找到一条新的相同距离的最短路,则dp[u][0]+=dp[v][cas],其他不用更新,也不入队
  66. 情况3:dist[v][cas]+w(v,u)<dist[u][1],不可以更新最短距离,但可以更新次短的,则更新dist[u][1]和dp[u][1]
  67. dist[u][1]=dist[v][cas]+w(v,u);
  68. dp[u][1]=dp[v][cas];
  69. 把node(dist[u][1],u,1)放入队列
  70. 情况4:dist[v][cas]+w(v,u)==dist[u][1] 找到一条新的相同距离的次短路,则dp[u][1]+=dp[v][cas],其他不更新。
  71. */
  72.  
  73. void dijkstra(int start,int end)
  74. {
  75. for(int i=;i<n;i++)
  76. {
  77. dist[i][]=dist[i][]=INF;
  78. }
  79. memset(dp,,sizeof(dp));
  80. memset(vis,false,sizeof(vis));
  81. priority_queue<node> Q;
  82. node p,q;
  83. dist[start][]=;
  84. dp[start][]=;
  85. p.dist=,p.mark=,p.v=start;
  86. Q.push(p);
  87. while(!Q.empty())
  88. {
  89. p=Q.top();
  90. Q.pop();
  91. if(vis[p.v][p.mark]) continue;
  92. //if(dist[p.v][p.mark]!=p.dist)continue;
  93. vis[p.v][p.mark]= true;
  94. for(int i=;i<g[p.v].size();i++)
  95. {
  96. int v=g[p.v][i].v;
  97. int w=g[p.v][i].w;
  98. if(!vis[v][] && p.dist+w <dist[v][])
  99. {
  100. //可能为次短路
  101. if(dist[v][]!=INF)
  102. {
  103. q.v=v,q.dist=dist[v][],q.mark=;
  104. dist[v][]=dist[v][];
  105. dp[v][]=dp[v][];
  106. Q.push(q);
  107. }
  108. dist[v][]=p.dist+w;
  109. dp[v][]=dp[p.v][p.mark];
  110. q.v=v,q.dist=dist[v][],q.mark=;
  111. Q.push(q);
  112. }
  113. else if(!vis[v][] && p.dist+w==dist[v][])
  114. {
  115. dp[v][]+=dp[p.v][p.mark];
  116. }
  117. else if(!vis[v][] && p.dist+w<dist[v][])
  118. {
  119. dist[v][]=p.dist+w;
  120. dp[v][]=dp[p.v][p.mark];
  121. q.dist=dist[v][],q.v=v,q.mark=;
  122. Q.push(q);
  123. }
  124. else if(!vis[v][]&&p.dist+w==dist[v][])
  125. {
  126. dp[v][]+=dp[p.v][p.mark];
  127. }
  128. }
  129. }
  130. }
  131.  
  132. int main(){
  133. while(~scanf("%d%d%d%d",&n,&m,&s,&e))
  134. {
  135. for(int i=;i<n;i++)g[i].clear();
  136. for(int i=;i<=m;i++)
  137. {
  138. int u,v,w;
  139. scanf("%d%d%d",&u,&v,&w);
  140. Edge p;
  141. p.v=v,p.w=w;
  142. g[u].push_back(p);
  143. }
  144. dijkstra(s,e);
  145. printf("%d %d\n",dist[e][],dp[e][]);
  146. }
  147. return ;
  148. }

HDU 3191 次短路长度和条数的更多相关文章

  1. hdu 3191 次短路的长度和个数

    http://acm.hdu.edu.cn/showproblem.php?pid=3191 求次短路的长度和个数 相关分析在这里http://blog.csdn.net/u012774187/art ...

  2. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. HDU1688-POJ3463-Sightseeing(求次短路的条数)

    题意 求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数. 题解  dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度 ...

  4. HDU 1688 Sightseeing 【输出最短路+次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...

  5. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

  6. hdu 3191 How Many Paths Are There (次短路径数)

    How Many Paths Are There Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  7. HDU3191 【输出次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3191 How Many Paths Are There Time Limit: 2000/1000 M ...

  8. 最短路和次短路的条数(dijstra算法或spfa算法)POJ3463

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  9. POJ---3463 Sightseeing 记录最短路和次短路的条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9247   Accepted: 3242 Descr ...

随机推荐

  1. codis__使用注意事项

    codis 不支持批量的命令, codis对 redis-server 的最低版本要求是 2.8.13

  2. [转] iOS中@class #import #include 简介

    [转载自:http://blog.csdn.net/chengwuli125/article/details/9705315] 一.解析        很多刚开始学习iOS开发的同学可能在看别人的代码 ...

  3. 容器化VS微服务

    1 微服务 1.1 思想 开发人员自己测试.部署和运维自己编写的代码,即自己负责构建生命周期的全部. 1.2 Spring Boot 提供服务化的能力,即把容器.服务所需依赖和服务一起打包成一个jar ...

  4. MACD 的数学解释

    目录 MACD 的数学解释 MACD 的一般定义 引入延迟算子 Taylor 展开 权重分析 共振? MACD 的数学解释 MACD 的一般定义 \[ \begin{align*} DIF & ...

  5. 在Grafana中可视化Jenkins管道结果

    这次我描述了一些稍微轻松的话题,与之前的一些帖子相比.就个人而言,我认为Grafana是一个非常酷的工具,用于可视化任何时间轴数据.事实证明,使用InfluxDB插件存储和可视化Jenkins构建结果 ...

  6. python学习,day2:字典

    字典的增删改查 # coding=utf-8 # Author: RyAn Bi info = { 'stu1101':'Tenglan Wu', 'stu1102':'longze Luola', ...

  7. js高级程序设计 笔记 --- 错误处理、json和ajax

    1,错误处理 1,try-catch语句 try{可能导致错误的代码} catch(error) {在错误发生时该怎么处理} error.message是所有浏览器都支持的属性. finally语句是 ...

  8. CDH6安装文档

    1.准备工作 1.1 环境 centos7.jdk8.mysql5.7.python2.7.CDH6 1.2文件下载 1.2.1 cloudmanger地址 https://archive.cloud ...

  9. system命令

    服务查看 查看所有服务运行状态: service --status-all chkconfig --list 查看单个服务的运行状态 service sshd status 查看启动状态,是否开机自动 ...

  10. 批量生成python自动化测试脚本

    先前有家供应商与我们合作开发自动化工程,采用的py unittest作为脚本运行框架.我发现他们出的脚本都是挨个手写的,格式上也是参差不齐.所以有了根据用例表批量生成脚本的一段小代码 对一个测试脚本必 ...