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

社交网络的加强版。floyd肯定是跑不过了。

首先枚举一个起点开始跑spfa,然后在最短路图上统计答案,(最短路图是DAG)

对于一条在最短路图上的边(x.y),被经过次数是(源点到x的方案数)*(y的后继结点个数)。。。

这个很显然,然后因为是DAG这两个值可以通过拓扑排序或记忆化搜索来解决。

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int N=100050;
const int Mod=1000000007;
int head[N],to[N],nxt[N],v[N],cnt,n,m;
ll ans[N],dp[N],dp2[N],dis[N],vis[N],du[N];
struct data{
int x,y,w;
}e[N];
struct Data{
int x,w;
};
vector<Data> p[N];
void lnk(int x,int y,int z){
to[++cnt]=y,nxt[cnt]=head[x],v[cnt]=z,head[x]=cnt;
p[y].push_back((Data){x,z});
}
queue<int> Q;
void spfa(int s){
for(int i=1;i<=n;i++) dis[i]=19260817,vis[i]=0;
Q.push(s);vis[s]=1;dis[s]=0;
while(!Q.empty()){
int x=Q.front();Q.pop();vis[x]=0;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[x]+v[i]){
dis[y]=dis[x]+v[i];
if(!vis[y]) Q.push(y),vis[y]=1;
}
}
}
}
int dfs1(int x){
if(dp[x]) return dp[x];
for(int i=0;i<p[x].size();i++){
int y=p[x][i].x;
if(dis[y]==dis[x]-p[x][i].w){du[y]++;(dp[x]+=dfs1(y))%=Mod;}
}
return dp[x];
}
void topsort(){
for(int i=1;i<=n;i++) if(du[i]==0) Q.push(i);
while(!Q.empty()){
int x=Q.front();Q.pop();
for(int i=0;i<p[x].size();i++){
int y=p[x][i].x;
if(dis[y]==dis[x]-p[x][i].w){
du[y]--;dp2[y]+=dp2[x];
if(du[y]==0) Q.push(y);
}
}
}
}
int main(){
freopen("roadsw.in","r",stdin);
freopen("roadsw.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
lnk(e[i].x,e[i].y,e[i].w);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) dp[j]=dp2[j]=0,du[j]=0;
spfa(i);
dp[i]=1;for(int j=1;j<=n;j++) dp[j]=dfs1(j);
for(int j=1;j<=n;j++) dp2[j]=1;topsort();
for(int j=1;j<=m;j++) if(dis[e[j].x]+e[j].w==dis[e[j].y]) (ans[j]+=dp[e[j].x]*dp2[e[j].y])%=Mod;
}
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}

  

bzoj 2750: [HAOI2012]Road的更多相关文章

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

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

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

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

  3. BZOJ2750: [HAOI2012]Road

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

  4. [HAOI2012]Road

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

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

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

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

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

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

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...

  8. ●BZOJ 2752 [HAOI2012]高速公路(road)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2752题解: 期望,线段树. 把每个路段看成一个点,那么对于l~R的操作,就可以转化为对l~r ...

  9. BZOJ 2750 HAOI 2012 Road 高速公路 最短路

    题意: 给出一个有向图,求每条边有多少次作为最短路上的边(任意的起始点). 范围:n <= 1500, m <= 5005 分析: 一个比较容易想到的思路:以每个点作为起点,做一次SPFA ...

随机推荐

  1. 小白关于python 对象和内存的关系的一些感悟和疑惑,望大神指教

    首先你输入了一个字符串,这个字符串是有大小的,电脑将其放在内存中,自动给其一个起始指针指向这个字符串的首位置,然后,你将这个字符串赋值给一个变量,这个对象又在内存中开辟出一个空间,这个变量会自动连接这 ...

  2. LVS+keepalived快速搭建测试环境

    #LVS+keepalived快速搭建测试环境 #LVS+keepalived快速搭建测试环境 #centos6 X64 # LVS 负载均衡模式:DR(直接路由) 192.168.18.31 mas ...

  3. PHP随手记1--内置函数date

    1. date_default_timezone_set date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区 在php中只用 mktime() 函数时 ...

  4. PHP扩展安装方法

    php扩展安装方法极简单. 也遵循3大步.但多出一个phpize的步骤. 1.pecl.php.net  在右上解的输入框 中输入需要的扩展    比如 redis 2.搜索完成后会看到两个蓝色的框 ...

  5. 1、C#基础 - C# 语言简介

    C# 语言和 .NET Framework 介绍 C# 是类型安全的面向对象的精妙语言,可帮助开发者生成在 .NET Framework 上运行的各种安全可靠的应用程序. C# 可用于创建 Windo ...

  6. mac mono Fiddler.exe启动失败

    mono version 5.4 fiddler version 4.6 启动fiddler:mono Fiddler.exe 启动报错 WARNING: The Carbon driver has ...

  7. 前端开发者常用的9个JavaScript图表库

    当前,数据可视化已经成为数据科学领域非常重要的一部分.不同网络系统中产生的数据,都需要经过适当的可视化处理,以便更好的呈现给用户读取和分析. 对任何一个组织来说,如果能够充分的获取数据.可视化数据和分 ...

  8. sqlserver2005公布与订阅配置步骤

    1,新建公布 前提条件:第一要调通网络,在sqlserver configuration manager 中选择mssqlserver的协议把named pipes改为启用.第二要建立一个目录D:\b ...

  9. leetcode:程序猿面试技巧

    起因 写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然非常多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有非常多不清楚的地方,于是有了对于每道题 ...

  10. 产品研发管理(二):使用SubVersion进行代码管理

    概述 这是产品研发管理系列文章的第二篇:使用SubVersion进行代码管理. 介绍如何使用SubVersion的资料已经许多,这里不准备介绍如何使用SubVersion. 这篇文章主要介绍如何进行代 ...