http://acm.hdu.edu.cn/showproblem.php?pid=3191

求次短路的长度和个数

相关分析在这里http://blog.csdn.net/u012774187/article/details/40681515

  1. #pragma comment(linker, "/STACK:36777216")
  2. #pragma GCC optimize ("O2")
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <string>
  8. #include <queue>
  9. #include <map>
  10. #include <iostream>
  11. #include <algorithm>
  12. using namespace std;
  13. #define RD(x) scanf("%d",&x)
  14. #define RD2(x,y) scanf("%d%d",&x,&y)
  15. #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  16. #define clr0(x) memset(x,0,sizeof(x))
  17. #define clr1(x) memset(x,-1,sizeof(x))
  18. #define eps 1e-9
  19. const double pi = acos(-1.0);
  20. typedef long long LL;
  21. typedef unsigned long long ULL;
  22. const int modo = 1e9 + 7;
  23. const int INF = 0x3f3f3f3f;
  24. const int inf = 0x3fffffff;
  25. const LL _inf = 1e18;
  26. const int maxn = 55,maxm = 10005;
  27. struct edge{
  28. int v,w,next;
  29. edge(){};
  30. edge(int vv,int ww,int nnext):v(vv),w(ww),next(nnext){};
  31. }e[maxn*maxn*2];
  32. int head[maxn],inq[maxn][2],dist[maxn][2],cnt[maxn][2];//0最短1次短
  33. int n,m,ecnt;
  34. void init()
  35. {
  36. clr1(head);
  37. ecnt = 0;
  38. for(int i = 1;i <= maxn;++i)
  39. dist[i][0] = dist[i][1] = inf;
  40. //fill(dist,dist+maxn*2,inf);
  41. clr0(inq),clr0(cnt);
  42. }
  43. void add(int u,int v,int w)
  44. {
  45. e[ecnt] = edge(v,w,head[u]);
  46. head[u] = ecnt++;
  47. // e[ecnt] = edge(u,w,head[v]);
  48. // head[v] = ecnt++;
  49. }
  50. typedef pair<int,int> p2;
  51. struct cmp {
  52. bool operator() (const p2 &a, const p2 &b)
  53. {
  54. if(dist[a.first][a.second] != dist[b.first][b.second])
  55. return dist[a.first][a.second] > dist[b.first][b.second];
  56. else
  57. return a.first > b.first;
  58. }
  59. };
  60. void spfa(int src,int dst)
  61. {
  62. priority_queue<p2 , vector<p2> , cmp> q;
  63. q.push(make_pair(src,0));
  64. dist[src][0] = 0,cnt[src][0] = 1;
  65. while(!q.empty()){
  66. int u = q.top().first,flag = q.top().second;
  67. q.pop();
  68. if(inq[u][flag]) continue;
  69. inq[u][flag] = 1;
  70. for(int i = head[u];i != -1;i = e[i].next){
  71. int v = e[i].v,w = e[i].w;
  72. if(!inq[v][0] && dist[v][0] > dist[u][flag] + e[i].w){
  73. if(dist[v][0] != inf){
  74. dist[v][1] = dist[v][0];
  75. cnt[v][1] = cnt[v][0];
  76. q.push(make_pair(v,1));
  77. }
  78. dist[v][0] = dist[u][flag] + e[i].w;
  79. cnt[v][0] = cnt[u][flag];
  80.  
  81. q.push(make_pair(v,0));
  82. }else if(!inq[v][0] && dist[v][0] == dist[u][flag] + e[i].w){
  83. cnt[v][0] += cnt[u][flag];
  84. }else if(!inq[v][1] && dist[v][1] > dist[u][flag] + e[i].w){
  85. dist[v][1] = dist[u][flag] + e[i].w;
  86. cnt[v][1] = cnt[u][flag];
  87.  
  88. q.push(make_pair(v,1));
  89. }else if(!inq[v][1] && dist[v][1] == dist[u][flag] + e[i].w){
  90. cnt[v][1] += cnt[u][flag];
  91. }
  92. }
  93. }
  94. printf("%d %d\n",dist[dst][1],cnt[dst][1]);
  95. }
  96.  
  97. int main(){
  98. int u,v,w,s,t;
  99. while(~RD2(n,m)){
  100. RD2(s,t);s++,t++;
  101. init();
  102. while(m--){
  103. RD3(u,v,w);u++,v++;
  104. add(u,v,w);
  105. }
  106. spfa(s,t);
  107. }
  108. return 0;
  109. }

上面是错误代码

经过筛查,发现是

  1. if(dist[a.first][a.second] != dist[b.first][b.second])
  2. return dist[a.first][a.second] > dist[b.first][b.second];

有问题,因为不同的路径到达同一个点的同一个状态的值不一样,所有比较和更新穿插在一起就会出错了

可是每次更新dist数组都是向小了更新,所以不应该有影响啊..?

以下是AC代码,谁能清楚一点地告诉为啥上面的程序就不对呢?

  1. #pragma comment(linker, "/STACK:36777216")
  2. #pragma GCC optimize ("O2")
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <string>
  8. #include <queue>
  9. #include <map>
  10. #include <iostream>
  11. #include <algorithm>
  12. using namespace std;
  13. #define RD(x) scanf("%d",&x)
  14. #define RD2(x,y) scanf("%d%d",&x,&y)
  15. #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  16. #define clr0(x) memset(x,0,sizeof(x))
  17. #define clr1(x) memset(x,-1,sizeof(x))
  18. #define eps 1e-9
  19. const double pi = acos(-1.0);
  20. typedef long long LL;
  21. typedef unsigned long long ULL;
  22. const int modo = 1e9 + 7;
  23. const int INF = 0x3f3f3f3f;
  24. const int inf = 0x3fffffff;
  25. const LL _inf = 1e18;
  26. const int maxn = 55,maxm = 10005;
  27. struct edge{
  28. int v,w,next;
  29. edge(){};
  30. edge(int vv,int ww,int nnext):v(vv),w(ww),next(nnext){};
  31. }e[maxn*maxn*2];
  32. int head[maxn],inq[maxn][2],dist[maxn][2],cnt[maxn][2];//0最短1次短
  33. int n,m,ecnt;
  34. struct node{
  35. int v,flag,dis;
  36. node(int a,int b,int c):v(a),flag(b),dis(c){};
  37. bool operator < (const node & a) const{
  38. if(a.dis == dis)
  39. return a.v < v;
  40. return a.dis < dis;
  41. }
  42. };
  43. void init()
  44. {
  45. clr1(head);
  46. ecnt = 0;
  47. for(int i = 0;i <= n;++i)
  48. dist[i][0] = dist[i][1] = inf;
  49. //fill(dist,dist+maxn*2,inf);
  50. clr0(inq),clr0(cnt);
  51. }
  52. void add(int u,int v,int w)
  53. {
  54. e[ecnt] = edge(v,w,head[u]);
  55. head[u] = ecnt++;
  56. // e[ecnt] = edge(u,w,head[v]);
  57. // head[v] = ecnt++;
  58. }
  59. void spfa(int src,int dst)
  60. {
  61. priority_queue<node> q;
  62. q.push(node(src,0,0));
  63. dist[src][0] = 0,cnt[src][0] = 1;
  64. while(!q.empty()){
  65. int u = q.top().v,flag = q.top().flag,dis = q.top().dis;
  66. q.pop();
  67. if(inq[u][flag]) continue;
  68. inq[u][flag] = 1;
  69. for(int i = head[u];i != -1;i = e[i].next){
  70. int v = e[i].v,w = e[i].w;
  71. if(!inq[v][0] && dist[v][0] > dis + e[i].w){
  72. if(dist[v][0] != inf){
  73. dist[v][1] = dist[v][0];
  74. cnt[v][1] = cnt[v][0];
  75. q.push(node(v,1,dist[v][1]));
  76. }
  77. dist[v][0] = dis + e[i].w;
  78. cnt[v][0] = cnt[u][flag];
  79.  
  80. q.push(node(v,0,dist[v][0]));
  81. }else if(!inq[v][0] && dist[v][0] == dis + e[i].w){
  82. cnt[v][0] += cnt[u][flag];
  83. }else if(!inq[v][1] && dist[v][1] > dis + e[i].w){
  84. dist[v][1] = dis + e[i].w;
  85. cnt[v][1] = cnt[u][flag];
  86.  
  87. q.push(node(v,1,dist[v][1]));
  88. }else if(!inq[v][1] && dist[v][1] == dis+ e[i].w){
  89. cnt[v][1] += cnt[u][flag];
  90. }
  91. }
  92. }
  93. printf("%d %d\n",dist[dst][1],cnt[dst][1]);
  94. }
  95.  
  96. int main(){
  97. int u,v,w,s,t;
  98. while(~RD2(n,m)){
  99. RD2(s,t);s++,t++;
  100. init();
  101. while(m--){
  102. RD3(u,v,w);u++,v++;
  103. add(u,v,w);
  104. }
  105. spfa(s,t);
  106. }
  107. return 0;
  108. }

AC代码2

  1. #pragma comment(linker, "/STACK:36777216")
  2. #pragma GCC optimize ("O2")
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <string>
  8. #include <queue>
  9. #include <map>
  10. #include <iostream>
  11. #include <algorithm>
  12. using namespace std;
  13. #define RD(x) scanf("%d",&x)
  14. #define RD2(x,y) scanf("%d%d",&x,&y)
  15. #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  16. #define clr0(x) memset(x,0,sizeof(x))
  17. #define clr1(x) memset(x,-1,sizeof(x))
  18. #define eps 1e-9
  19. const double pi = acos(-1.0);
  20. typedef long long LL;
  21. typedef unsigned long long ULL;
  22. const int modo = 1e9 + 7;
  23. const int INF = 0x3f3f3f3f;
  24. const int inf = 0x3fffffff;
  25. const LL _inf = 1e18;
  26. const int maxn = 55,maxm = 10005;
  27. struct edge{
  28. int v,w,next;
  29. edge(){};
  30. edge(int vv,int ww,int nnext):v(vv),w(ww),next(nnext){};
  31. }e[maxn*maxn*2];
  32. int head[maxn],inq[maxn][2],dist[maxn][2],cnt[maxn][2];//0最短1次短
  33. int n,m,ecnt;
  34. struct node{
  35. int v,flag,dis;
  36. node(int a,int b,int c):v(a),flag(b),dis(c){};
  37. bool operator < (const node & a) const{
  38. if(a.dis == dis)
  39. return a.v < v;
  40. return a.dis < dis;
  41. }
  42. };
  43. void init()
  44. {
  45. clr1(head);
  46. ecnt = 0;
  47. for(int i = 0;i <= n;++i)
  48. dist[i][0] = dist[i][1] = inf;
  49. //fill(dist,dist+maxn*2,inf);
  50. clr0(inq),clr0(cnt);
  51. }
  52. void add(int u,int v,int w)
  53. {
  54. e[ecnt] = edge(v,w,head[u]);
  55. head[u] = ecnt++;
  56. // e[ecnt] = edge(u,w,head[v]);
  57. // head[v] = ecnt++;
  58. }
  59. void spfa(int src,int dst)
  60. {
  61. priority_queue<node> q;
  62. q.push(node(src,0,0));
  63. dist[src][0] = 0,cnt[src][0] = 1;
  64. while(!q.empty()){
  65. int u = q.top().v,flag = q.top().flag;//dis = q.top().dis;
  66. q.pop();
  67. if(inq[u][flag]) continue;
  68. inq[u][flag] = 1;
  69. for(int i = head[u];i != -1;i = e[i].next){
  70. int v = e[i].v,w = e[i].w;
  71. if(!inq[v][0] && dist[v][0] > dist[u][flag] + e[i].w){
  72. if(dist[v][0] != inf){
  73. dist[v][1] = dist[v][0];
  74. cnt[v][1] = cnt[v][0];
  75. q.push(node(v,1,dist[v][1]));
  76. }
  77. dist[v][0] = dist[u][flag] + e[i].w;
  78. cnt[v][0] = cnt[u][flag];
  79.  
  80. q.push(node(v,0,dist[v][0]));
  81. }else if(!inq[v][0] && dist[v][0] == dist[u][flag] + e[i].w){
  82. cnt[v][0] += cnt[u][flag];
  83. }else if(!inq[v][1] && dist[v][1] > dist[u][flag] + e[i].w){
  84. dist[v][1] = dist[u][flag] + e[i].w;
  85. cnt[v][1] = cnt[u][flag];
  86.  
  87. q.push(node(v,1,dist[v][1]));
  88. }else if(!inq[v][1] && dist[v][1] == dist[u][flag] + e[i].w){
  89. cnt[v][1] += cnt[u][flag];
  90. }
  91. }
  92. }
  93. printf("%d %d\n",dist[dst][1],cnt[dst][1]);
  94. }
  95.  
  96. int main(){
  97. int u,v,w,s,t;
  98. while(~RD2(n,m)){
  99. RD2(s,t);s++,t++;
  100. init();
  101. while(m--){
  102. RD3(u,v,w);u++,v++;
  103. add(u,v,w);
  104. }
  105. spfa(s,t);
  106. }
  107. return 0;
  108. }

#pragma comment(linker, "/STACK:36777216")#pragma GCC optimize ("O2")#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include
<queue>#include <map>#include <iostream>#include <algorithm>using namespace std;#define RD(x) scanf("%d",&x)#define RD2(x,y) scanf("%d%d",&x,&y)#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)#define clr0(x) memset(x,0,sizeof(x))#define clr1(x) memset(x,-1,sizeof(x))#define
eps 1e-9const double pi = acos(-1.0);typedef long long LL;typedef unsigned long long ULL;const int modo = 1e9 + 7;const int INF = 0x3f3f3f3f;const int inf = 0x3fffffff;const LL _inf = 1e18;const int maxn = 55,maxm = 10005;struct edge{ int v,w,next; edge(){};
edge(int vv,int ww,int nnext):v(vv),w(ww),next(nnext){};}e[maxn*maxn*2];int head[maxn],inq[maxn][2],dist[maxn][2],cnt[maxn][2];//0最短1次短int n,m,ecnt;void init(){ clr1(head); ecnt = 0; for(int i = 0;i < maxn;++i) dist[i][0] = dist[i][1] = inf; //fill(dist,dist+maxn*2,inf);
clr0(inq),clr0(cnt);}void add(int u,int v,int w){ e[ecnt] = edge(v,w,head[u]); head[u] = ecnt++;// e[ecnt] = edge(u,w,head[v]);// head[v] = ecnt++;}typedef pair<int,int> p2;struct cmp { bool operator() (const p2 &a, const p2 &b) { if(dist[a.first][a.second]
!= dist[b.first][b.second]) return dist[a.first][a.second] > dist[b.first][b.second]; else return a.first > b.first; }};void spfa(int src,int dst){ priority_queue<p2 , vector<p2> , cmp> q; q.push(make_pair(src,0)); dist[src][0] = 0,cnt[src][0] = 1; while(!q.empty()){
int u = q.top().first,flag = q.top().second; q.pop(); if(inq[u][flag]) continue; inq[u][flag] = 1; for(int i = head[u];i != -1;i = e[i].next){ int v = e[i].v,w = e[i].w; if(!inq[v][0] && dist[v][0] > dist[u][flag] + e[i].w){ if(dist[v][0] != inf){ dist[v][1]
= dist[v][0]; cnt[v][1] = cnt[v][0]; q.push(make_pair(v,1)); } dist[v][0] = dist[u][flag] + e[i].w; cnt[v][0] = cnt[u][flag]; q.push(make_pair(v,0)); }else if(!inq[v][0] && dist[v][0] == dist[u][flag] + e[i].w){ cnt[v][0] += cnt[u][flag]; }else if(!inq[v][1]
&& dist[v][1] > dist[u][flag] + e[i].w){ dist[v][1] = dist[u][flag] + e[i].w; cnt[v][1] = cnt[u][flag]; q.push(make_pair(v,1)); }else if(!inq[v][1] && dist[v][1] == dist[u][flag] + e[i].w){ cnt[v][1] += cnt[u][flag]; } } } printf("%d %d\n",dist[dst][1],cnt[dst][1]);}int
main(){ int u,v,w,s,t; while(~RD2(n,m)){ RD2(s,t);s++,t++; init(); while(m--){ RD3(u,v,w);u++,v++; add(u,v,w); } spfa(s,t); } return 0;}

hdu 3191 次短路的长度和个数的更多相关文章

  1. HDU 3191 次短路长度和条数

    http://www.cnblogs.com/wally/archive/2013/04/16/3024490.html http://blog.csdn.net/me4546/article/det ...

  2. HDU3191-How many paths are there(次短路的长度及其个数)

    oooccc1 is a Software Engineer who has to ride to the work place every Monday through Friday. For a ...

  3. COJ 0579 4020求次短路的长度

    4020求次短路的长度 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个地图上共有N个路口(编号分别为1到N),R条道路( ...

  4. HDU - 2066 最短路+加一个节点

    一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到文件结束. 每组的第一行是三个整数M,Z,Y 接着有M行, ...

  5. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  6. 【最长下降子序列的长度和个数】 poj 1952

    转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size] ...

  7. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. hdu 5521 最短路

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

随机推荐

  1. 使用Visual VM 查看linux中tomcat运行时JVM内存

    前言:在生产环境中经常发生服务器内存溢出,假死或者线程死锁等异常,导致服务不可用.我们经常使用的解决方法是通过分析错误日记,然后去寻找代码到底哪里出现了问题,这样的方式也许会奏效,但是排查起来耗费时间 ...

  2. 洛谷1312 Mayan游戏

    原题链接 讨厌这种大搜索题 基本就是模拟搜索,注意细节即可. 以下是我用的两个剪枝: 将块向左移的前提是左边为空,因为该题要求先右后左,所以若左边有块,那么在上一次搜索向右移的时候一定会搜过,且字典序 ...

  3. Scrapy-Redis分布式策略

    Scrapy-Redis分布式策略 原理图: 假设有四台电脑:Windows 10.Mac OS X.Ubuntu 16.04.CentOS 7.2,任意一台电脑都可以作为 Master端 或 Sla ...

  4. PHP redis 群发短信

    $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $list = M('Sms')->field('phone')-&g ...

  5. android 使用webview 加载网页

    1. <WebView android:id="@+id/webView" android:layout_width="fill_parent" andr ...

  6. SpringBoot的读取properties文件的方式

    转载:https://www.imooc.com/article/18252一.@ConfigurationProperties方式 自定义配置类:PropertiesConfig.java pack ...

  7. apm飞行模式

    参考 :https://www.cnblogs.com/jins-note/p/9580054.html   复制别人的,因为很久(几年)玩一次,所以会忘,也不好找,,若作者要求,请给留言,会立即删除 ...

  8. 有关PHP 10条有用的建议--转(柒捌玖零)

    1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里. 这种方法把存储空间降到了接近四分之一(char(15)的15个字节对整形的4个字节),计算一个特定的地址是不 ...

  9. k-SLAM:k-mer Sorted List Alignment and Metagenomics

    k-SLAM 是基于大量高通量宏基因组序列数据分析的比对程序,它基于k-mer技术上在reads和序列之间进行比较,然后用Smith-Waterman算法验证.校准是连接在一起组成一个伪组装用来提高特 ...

  10. jquery 特效

    http://demo.howtoexe.com/instagram-gravity-gallery/index.html