首先跑正反两遍dij求由起点/终点到某点的最短路条数,这样条件一就转化为f(S,A)*f(T,A)+f(S,B)*f(T,B)=f(S,T)。同时建出最短路DAG,这样图中任何一条S到T的路径都是最短路径,对于条件二就只需要判断A是否能走到B。注意到空间开的非常大。那么对于条件二的可达性显然是可以bitset优化的。对于条件一可以map套bitset。两者and再count一下就可以了。bzoj的空间限制开小了于是这种做法就直接MLE了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<map>
  9. #include<bitset>
  10. using namespace std;
  11. #define ll long long
  12. #define N 50010
  13. #define P 1000000007
  14. char getc(){char c=getchar();while (c==||c==||c==) c=getchar();return c;}
  15. int gcd(int n,int m){return m==?n:gcd(m,n%m);}
  16. int read()
  17. {
  18. int x=,f=;char c=getchar();
  19. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  20. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  21. return x*f;
  22. }
  23. int n,m,S,T,t,p[N],f[][N],g[N];
  24. ll d[][N];
  25. bool flag[N];
  26. struct data{int to,nxt,len;
  27. }edge[N<<];
  28. struct data2
  29. {
  30. int x;ll d;
  31. bool operator <(const data2&a) const
  32. {
  33. return d>a.d;
  34. }
  35. };
  36. priority_queue<data2> q;
  37. bitset<N> to[N],from[N];
  38. map<int,bitset<N> > cnt;
  39. void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
  40. void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
  41. void dijkstra(int S,int op)
  42. {
  43. memset(d[op],,sizeof(d[op]));d[op][S]=;f[op][S]=;
  44. memset(flag,,sizeof(flag));
  45. while (!q.empty()) q.pop();
  46. q.push((data2){S,});
  47. for (;;)
  48. {
  49. while (!q.empty()&&flag[q.top().x]) q.pop();
  50. if (q.empty()) break;
  51. data2 x=q.top();q.pop();
  52. flag[x.x]=;
  53. for (int i=p[x.x];i;i=edge[i].nxt)
  54. {
  55. if (x.d+edge[i].len<d[op][edge[i].to])
  56. {
  57. d[op][edge[i].to]=x.d+edge[i].len;
  58. q.push((data2){edge[i].to,d[op][edge[i].to]});
  59. f[op][edge[i].to]=;
  60. }
  61. if (x.d+edge[i].len==d[op][edge[i].to])
  62. inc(f[op][edge[i].to],f[op][x.x]);
  63. }
  64. }
  65. }
  66. namespace shortestpathDAG
  67. {
  68. int p[N]={},q[N]={},degree[N]={},t=;
  69. struct data{int to,nxt;}edge[N];
  70. void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
  71. void topsort()
  72. {
  73. for (int i=;i<=t;i++) degree[edge[i].to]++;
  74. int head=,tail=;for (int i=;i<=n;i++) if (!degree[i]) q[++tail]=i;
  75. while (tail<n)
  76. {
  77. int x=q[++head];
  78. for (int i=p[x];i;i=edge[i].nxt)
  79. {
  80. degree[edge[i].to]--;
  81. if (!degree[edge[i].to]) q[++tail]=edge[i].to;
  82. }
  83. }
  84. }
  85. void work()
  86. {
  87. ll ans=;
  88. for (int i=;i<=n;i++)
  89. {
  90. int x=q[i];from[x][x]=;
  91. for (int j=p[x];j;j=edge[j].nxt)
  92. from[edge[j].to]|=from[x];
  93. }
  94. for (int i=n;i>=;i--)
  95. {
  96. int x=q[i];to[x][x]=;
  97. for (int j=p[x];j;j=edge[j].nxt)
  98. to[x]|=to[edge[j].to];
  99. ans+=((~(to[x]|from[x]))&cnt[(g[T]-g[x]+P)%P]).count();
  100. }
  101. cout<<(ans>>);
  102. }
  103. }
  104. int main()
  105. {
  106. #ifndef ONLINE_JUDGE
  107. freopen("bzoj5109.in","r",stdin);
  108. freopen("bzoj5109.out","w",stdout);
  109. const char LL[]="%I64d\n";
  110. #else
  111. const char LL[]="%lld\n";
  112. #endif
  113. n=read(),m=read(),S=read(),T=read();
  114. for (int i=;i<=m;i++)
  115. {
  116. int x=read(),y=read(),z=read();
  117. addedge(x,y,z),addedge(y,x,z);
  118. }
  119. dijkstra(S,),dijkstra(T,);
  120. if (f[][T]==) {cout<<(1ll*n*(n-)>>);return ;}
  121. for (int i=;i<=n;i++)
  122. {
  123. if (d[][i]+d[][i]==d[][T]) g[i]=1ll*f[][i]*f[][i]%P;
  124. cnt[g[i]][i]=;
  125. }
  126. for (int i=;i<=t;i+=)
  127. {
  128. if (d[][edge[i+].to]+d[][edge[i].to]+edge[i].len==d[][T]) shortestpathDAG::addedge(edge[i+].to,edge[i].to);
  129. if (d[][edge[i].to]+d[][edge[i+].to]+edge[i].len==d[][T]) shortestpathDAG::addedge(edge[i].to,edge[i+].to);
  130. }
  131. shortestpathDAG::topsort();
  132. shortestpathDAG::work();
  133. return ;
  134. }

BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)的更多相关文章

  1. bzoj5109: [CodePlus 2017]大吉大利,晚上吃鸡!

    Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏中,皮皮 和毛毛最喜欢做的事情就是堵桥,每每有一个好时机都能收到不少的快 ...

  2. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  3. [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))

    5109: [CodePlus 2017]大吉大利,晚上吃鸡! Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 107  Solved: 57[Sub ...

  4. [BZOJ5109]大吉大利,晚上吃鸡!

    [BZOJ5109]大吉大利,晚上吃鸡! 题目大意: 一张\(n(n\le5\times10^4)\)个点\(m(m\le5\times10^4)\)条边的无向图,节点编号为\(1\)到\(n\),边 ...

  5. GMA Round 1 大吉大利,晚上吃鸡

    传送门 大吉大利,晚上吃鸡 新年走亲访友能干点啥呢,咱开黑吃鸡吧. 这里有32个人,每个人都可能想玩或者不想玩,这样子一共有$2^{32}$种可能.而要开黑当然得4人4人组一队(四人模式),所以说如果 ...

  6. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)

    从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...

  7. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!

    n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...

  8. LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset

    题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...

  9. [BZOJ5109/CodePlus2017]大吉大利,晚上吃鸡!

    Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏中,皮皮和毛毛最喜欢做的事情就是堵桥,每每有一个好时机都能收到不少的快递 ...

随机推荐

  1. mysql帐号不允许从远程登陆

    默认情况下,mysql帐号不允许从远程登陆,只能在localhost登录.本文提供了二种方法设置mysql可以通过远程主机进行连接. 一.改表法 在localhost登入mysql后,更改 “mysq ...

  2. Hadoop(25)-高可用集群配置,HDFS-HA和YARN-HA

    一. HA概述 1. 所谓HA(High Available),即高可用(7*24小时不中断服务). 2. 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA ...

  3. Leecode刷题之旅-C语言/python-101对称二叉树

    /* * @lc app=leetcode.cn id=101 lang=c * * [101] 对称二叉树 * * https://leetcode-cn.com/problems/symmetri ...

  4. Python3爬虫(十二) 爬虫性能

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.简单的循环串行一个一个循环,耗时是最长的,是所有的时间综合 import requests url_list ...

  5. 生产Web架构优化方案(动态转静态)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.门户新闻业务: 1. 特点:网页一旦发布,再次改动网页内容的几率很低,新闻业务内容的静态化相对比较简单 2. ...

  6. 4364: [IOI2014]wall砖墙

    4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...

  7. html页面导出word文档

    1.加入两个外部js 1)FileSaver.js /* FileSaver.js * A saveAs() FileSaver implementation. * 1.3.2 * 2016-06-1 ...

  8. CentOS7安装Oracle 11gR2 图文详解

    注:Oracle11gR2 X64安装 一.环境准备 安装包: 1.VMware-workstation-full-11.1.0-2496824.exe 2.CentOS-7-x86_64-DVD-1 ...

  9. EF使用报错说缺少引用

            在程序中已经引用了EF,也引用了System.Data,但是一起报这个错误:        在类前面也已经写了 using System.Data.Entity,百思不得其解,最后才发 ...

  10. 获得通讯录并拨打电话 Android

    由于通讯录在手机里是以数据库贮存的 所以我们可以通过getContentResolver来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息, 当然 ...