最短路+拓扑序DP


  orz zyf & lyd

  统计每条边在多少条最短路径上……其实可以统计 有多少条最短路径经过了x,以及y出发到达任意一个结束点有多少种走法(沿最短路)

  我们可以用Dijkstra求出以 i 为起点的最短路径图,它是一个DAG,然后我们用dij扩展的顺序(一个拓扑序)来搞DP!

    令a[x]表示从 i 沿最短路走到 x 的方案数,b[x]表示从 x 往出走,沿最短路走到任意一个结束结点的总方案(就是经过x的最短路条数?只不过只看后半段)

  其实就是将最短路分开两半进行统计了……然后乘一下……

  通过这题的思路可以搞CTSC2015 Day1 T1?

  跪了,pq应该把<定义为a.d>b.d……唉真是傻逼了

  1. /**************************************************************
  2. Problem: 2750
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:2276 ms
  7. Memory:1388 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 2750
  11. #include<queue>
  12. #include<vector>
  13. #include<cstdio>
  14. #include<cstring>
  15. #include<cstdlib>
  16. #include<iostream>
  17. #include<algorithm>
  18. #define rep(i,n) for(int i=0;i<n;++i)
  19. #define F(i,j,n) for(int i=j;i<=n;++i)
  20. #define D(i,j,n) for(int i=j;i>=n;--i)
  21. #define pb push_back
  22. using namespace std;
  23. inline int getint(){
  24. int v=,sign=; char ch=getchar();
  25. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  26. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  27. return v*sign;
  28. }
  29. const int N=,M=,INF=~0u>>;
  30. const int P=;
  31. typedef long long LL;
  32. /******************tamplate*********************/
  33. int to[M],next[M],len[M],head[N],cnt;
  34. void add(int x,int y,int z){
  35. to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; len[cnt]=z;
  36. }
  37. struct node{
  38. int x,d;
  39. bool operator < (const node &b)const{ return d>b.d;}
  40. };
  41. int n,m,v[N],a[N],b[N],c[N],d[N];
  42. priority_queue<node>Q;
  43. int ans[M];
  44. void dijkstra(int S){
  45. memset(d,0x3f,sizeof d);
  46. memset(v,,sizeof v);
  47. d[S]=;
  48. int t=;
  49. Q.push((node){S,});
  50. while(!Q.empty()){
  51. int x=Q.top().x; Q.pop();
  52. if (v[x]) continue;
  53. v[x]=++t;
  54. for(int i=head[x];i;i=next[i]){
  55. int y=to[i],l=len[i];
  56. if (d[y]>d[x]+l){
  57. d[y]=d[x]+l;
  58. Q.push((node){y,d[y]});
  59. }
  60. }
  61. }
  62. F(i,,n) if (v[i]) c[v[i]]=i;
  63. memset(a,,sizeof a); a[c[]]=;
  64. F(i,,n) b[i]=;
  65. F(x,,t)
  66. for(int i=head[c[x]];i;i=next[i])
  67. if (d[to[i]]==d[c[x]]+len[i])
  68. a[to[i]]=(a[to[i]]+a[c[x]])%P;
  69. D(x,t,)
  70. for(int i=head[c[x]];i;i=next[i])
  71. if (d[to[i]]==d[c[x]]+len[i])
  72. b[c[x]]=(b[c[x]]+b[to[i]])%P;
  73. F(x,,n)
  74. for(int i=head[x];i;i=next[i])
  75. if (d[to[i]]==d[x]+len[i])
  76. ans[i]=(ans[i]+(LL)a[x]*b[to[i]]%P)%P;
  77. }
  78. int main(){
  79. #ifndef ONLINE_JUDGE
  80. freopen("2750.in","r",stdin);
  81. freopen("2750.out","w",stdout);
  82. #endif
  83. n=getint(); m=getint();
  84. F(i,,m){
  85. int x=getint(),y=getint(),z=getint();
  86. add(x,y,z);
  87. }
  88. F(i,,n) dijkstra(i);
  89. F(i,,m) printf("%d\n",ans[i]);
  90. return ;
  91. }

2750: [HAOI2012]Road

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 347  Solved: 155
[Submit][Status][Discuss]

Description

C
国有n座城市,城市之间通过m条单向道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且
仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。

Input

第一行包含两个正整数n、m
接下来m行每行包含三个正整数u、v、w,表示有一条从u到v长度为w的道路

Output

输出应有m行,第i行包含一个数,代表经过第i条道路的最短路的数目对1000000007取模后的结果

Sample Input

4 4
1 2 5
2 3 5
3 4 5
1 4 8

Sample Output

2
3
2
1

HINT

数据规模

30%的数据满足:n≤15、m≤30

60%的数据满足:n≤300、m≤1000

100%的数据满足:n≤1500、m≤5000、w≤10000

Source

[Submit][Status][Discuss]

【BZOJ】【2750】【HAOI2012】Road的更多相关文章

  1. 【BZOJ 2754 喵星球上的点名】

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2512  Solved: 1092[Submit][Status][Discuss] Descript ...

  2. 【BZOJ】【2752】【HAOI2012】高速公路(Road)

    数学期望/线段树 然而又是一道road= =上一道是2750…… 下次不要一看期望题就弃疗么…… 期望题≠不可做题……!! 其实在这题中,期望就是(所有情况下 权值之和)/(总方案数) 因为是等概率抽 ...

  3. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  4. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  5. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  6. 【BZOJ】【1025】【SCOI2009】游戏

    DP/整数拆分 整个映射关系可以分解成几个循环(置换群的预备知识?),那么总行数就等于各个循环长度的最小公倍数+1(因为有个第一行的1~N).那么有多少种可能的排数就等于问有多少种可能的最小公倍数. ...

  7. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  8. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  9. 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang

    点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...

  10. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

随机推荐

  1. C#基础语法补充

    [学习笔记]前接:https://www.cnblogs.com/aland-1415/p/7360509.html 一.异常处理 1.格式 try{ } catch{ } catch{ } ... ...

  2. CSU - 2062 Z‘s Array

    Description Z likes to play with array. One day his teacher gave him an array of n elements, and ask ...

  3. CentOS7配置ssh证书登录无效

    今天配置A服务器使用root用户ssh免密登录服务器B,配置过程很简单,由于这两台服务器开发人员之前生成过证书,我就直接在A服务器执行如下命令即可 # ssh-copy-id -i ~/.ssh/id ...

  4. date time insert

    DATE=`date '+%m/%d/%Y'`TIME=`date '+%H:%M:%S'` sed -i '1i1***** start*****' test.kshsed -i '2i\ REPO ...

  5. luoguP4101 [HEOI2014]人人尽说江南好 结论

    题目大意: 给定\(n\)堆初始大小为\(1\)的石堆 每次选择两堆石子合并,特别的,合并之后的两堆石子不能\(> m\) 询问先手必赢? 不妨设我们是先手,且最后我们必胜 我们考虑构造局面\( ...

  6. 【漏洞预警】方程式又一波大规模 0day 攻击泄漏,微软这次要血崩

    一大早起床是不是觉得阳光明媚岁月静好?然而网络空间刚刚诞生了一波核弹级爆炸!Shadow Brokers再次泄露出一份震惊世界的机密文档,其中包含了多个精美的 Windows 远程漏洞利用工具,可以覆 ...

  7. [HDU6196]happy happy happy

    题目大意: 有一个长度为n的数列,A和B两个人轮流从两端取数,B先取,A想使分数严格小于B且尽量接近B,问两人分数之差最小是多少. 思路: 折半搜索,先预处理出长度为part的最大差最小差,再预处理出 ...

  8. hdu 4536 dfs

    题意:XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选 ...

  9. JQ中get()与eq()的区别

    .eq() : 减少匹配元素的集合,根据index索引值,精确指定索引对象. .get() : 通过检索匹配jQuery对象得到对应的DOM元素. 同样是返回元素,那么eq与get有什么区别呢? eq ...

  10. 数据表-java类的映射

    1.一个数据表对应一个java类 2.数据表的字段对应java类的属性 3.一对多的数据表关系 一方用一个java对象表示 多方用一个java对象数组表示 4.多对多的数据表关系:采用中间表,将多对多 ...