2750: [HAOI2012]Road

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 728  Solved: 349
[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

显示代码纯文本

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #define pir pair<int,int>
  5. using namespace std;
  6. const int N=;
  7. const int inf=0x3f3f3f3f;
  8. const int mod=1e9+;
  9. struct edge{int v,w,next;}e[N<<];int tot,head[N];
  10. int n,m,dis[N],cnt[N],sum[N],ans[N*],q[N*];bool vis[N*];
  11. void add(int x,int y,int z){
  12. e[++tot].v=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
  13. }
  14. void dijkstra(int S){
  15. memset(dis,inf,(n+)<<);
  16. memset(vis,,(n+)<<);
  17. memset(cnt,,(n+)<<);cnt[S]=;
  18. priority_queue<pir,vector<pir>,greater<pir> >q;
  19. q.push(make_pair(dis[S]=,S));
  20. while(!q.empty()){
  21. pir t=q.top();q.pop();
  22. int x=t.second;
  23. if(vis[x]) continue;
  24. vis[x]=;
  25. for(int i=head[x];i;i=e[i].next){
  26. if(!vis[e[i].v]&&dis[e[i].v]>dis[x]+e[i].w){
  27. dis[e[i].v]=dis[x]+e[i].w;
  28. cnt[e[i].v]=cnt[x];
  29. q.push(make_pair(dis[e[i].v],e[i].v));
  30. }
  31. else if(dis[e[i].v]==dis[x]+e[i].w){
  32. cnt[e[i].v]+=cnt[x];
  33. cnt[e[i].v]%=mod;
  34. }
  35. }
  36. }
  37. }
  38. int dfs(int x){
  39. if(sum[x]) return sum[x];
  40. sum[x]=;
  41. for(int i=head[x];i;i=e[i].next){
  42. if(dis[e[i].v]!=dis[x]+e[i].w) continue;
  43. sum[x]+=dfs(e[i].v);
  44. ans[i]+=sum[e[i].v]*cnt[x];
  45. ans[i]%=mod;
  46. }
  47. return sum[x];
  48. }
  49. void init(){
  50. scanf("%d%d",&n,&m);
  51. for(int i=,x,y,z;i<=m;i++){
  52. scanf("%d%d%d",&x,&y,&z);
  53. add(x,y,z);
  54. }
  55. }
  56. void work(){
  57. for(int i=;i<=n;i++){
  58. memset(sum,,(n+)<<);
  59. dijkstra(i);
  60. dfs(i);
  61. }
  62. for(int i=;i<=m;i++) printf("%d\n",ans[i]);
  63. }
  64. int main(){
  65. freopen("roadsw.in","r",stdin);
  66. freopen("roadsw.out","w",stdout);
  67. init();
  68. work();
  69. return ;
  70. }

[HAOI2012]Road的更多相关文章

  1. BZOJ2750: [HAOI2012]Road

    2750: [HAOI2012]Road Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 113[Submit][Status ...

  2. BZOJ 2750: [HAOI2012]Road( 最短路 )

    对于每个点都跑最短路, 然后我们得到了个DAG, 在这DAG上更新每条边的答案. 考虑e(u, v)∈DAG对答案的贡献:  假设从S到u得路径数为A[u], 从v出发到达任意点的路径数为B[v], ...

  3. bzoj 2750: [HAOI2012]Road

    Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ...

  4. bzoj 2750: [HAOI2012]Road【spfa+dfs】

    枚举起点做spfa,然后一条边在最短路上的条件是dis[e[i].to]==dis[u]+e[i].va,所以每次spfa完之后,dfs出a[i]表示经过i点的最短路的起点数,b[i]表示经过i点的最 ...

  5. 【BZOJ】【2750】【HAOI2012】Road

    最短路+拓扑序DP orz zyf & lyd 统计每条边在多少条最短路径上……其实可以统计 有多少条最短路径经过了x,以及y出发到达任意一个结束点有多少种走法(沿最短路) 我们可以用Dijk ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

  8. BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

  9. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 627[Submit] ...

随机推荐

  1. Django的信号机制详解

    Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行. Django内置了一些信号 ...

  2. wordpress 插件 之 微信自动回复机器人

    微信目前越来越火,wordpress 也拥有众多用户 那我们来写个插件,把两者连起来吧! 目前已经测试完成,下面把相关的信息分享一下. 查看演示 请加我微信公众号 创新实验室,或直接扫描最底下的二维码 ...

  3. Django——如何使用Template以及如何向template传递变量

    如何使用模板系统 在Python代码中使用Django模板的最基本方式如下: 可以用原始的模板代码字符串创建一个 Template 对象, Django同样支持用指定模板文件路径的方式来创建 Temp ...

  4. TP框架I方法详解

    TP框架I方法详解   I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型. ...

  5. 【Oracle】查找每期数据都存在的产品

    现在存在以下数据 如上图:A01与A02同时存在201710.201711.201712中 我们现在要将其查找出来 如果上图的表结构如下: 那么查询的SQL如下: SELECT DISTINCT CO ...

  6. 51单片机 | 1-Wire总线及应用实例

    ———————————————————————————————————————————— 1-Wire总线 - - - - - - - - - - - - - - - - - - - - - - - ...

  7. Yii2.0 下使用 composer 安装七牛

    最近在捣鼓一个网站,要上传图片,于是选择了七牛.由于Yii2.0框架本身并不具有七牛用来上传图片的接口,只能自己动手给Yii2.0框架安装七牛了. 首先在根目录下的 composer.json 进行配 ...

  8. <转>c++ builder JSONCPP 注意事项 XE2 解决编译问题 _Mfl

    在C++Builder中使用JSONCPP需要注意的问题 1.使用STL的MAP而不是内建的MAP这个问题实际上和编译器无关.内建的MAP不是很稳定,当解析数据大于600K左右时,会崩溃.虽然一般来说 ...

  9. CoffeeScript 学习笔记

    1.什么叫 CoffeeScript CoffeeScript 是一种新的编程语言,构建于 JavaScript 之上.CoffeeScript 提供了一种简洁的语法,对 Python 或 Ruby ...

  10. useradd命令

    ◆useradd 1.作用 useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s shell] [-c comment] ...