Road(bzoj 2750)
Description
C国有n座城市,城市之间通过m条单向道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。
Input
第一行包含两个正整数n、m
接下来m行每行包含三个正整数u、v、w,表示有一条从u到v长度为w的道路
Output
输出应有m行,第i行包含一个数,代表经过第i条道路的最短路的数目对1000000007取模后的结果
Sample Input
1 2 5
2 3 5
3 4 5
1 4 8
Sample Output
3
2
1
HINT
数据规模
30%的数据满足:n≤15、m≤30
60%的数据满足:n≤300、m≤1000
100%的数据满足:n≤1500、m≤5000、w≤10000
/*
刚开始打的暴力,由于细节问题,挂成了10分,后来能改到50分。
一种很容易想到的方法是DP,但是很无奈的是想不到一种更新方法能够保证拓扑序,然而Dijkstral可以记录图的拓扑序。
记录每个节点前后各经过了几次,然后用乘法原理得到答案。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#define N 1510
#define M 5010
#define mod 1000000007
#define inf 1000000000
using namespace std;
int head[N],dis[N],inq[N],a[N],b[N],c[N],sum[M],n,m;
struct node{int v,w,pre;}e[M];
struct Node{
int id,dist;
bool operator< (const Node&s1) const {
return s1.dist<dist;
}
};priority_queue<Node> q; void add(int i,int u,int v,int w){
e[i].v=v;e[i].w=w;e[i].pre=head[u];head[u]=i;
}
void Dij(int S){
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(inq,,sizeof(inq));
for(int i=;i<=n;i++) dis[i]=inf;int cnt=;
dis[S]=;q.push((Node){S,});
while(!q.empty()){
int x=q.top().id;q.pop();
if(inq[x]) continue;
inq[x]=;c[++cnt]=x;
for(int i=head[x];i;i=e[i].pre)
if(dis[e[i].v]>dis[x]+e[i].w){
dis[e[i].v]=dis[x]+e[i].w;
q.push((Node){e[i].v,dis[e[i].v]});
}
}
for(int i=;i<=cnt;i++) b[c[i]]=;
a[S]=;
for(int i=;i<=cnt;i++)
for(int j=head[c[i]];j;j=e[j].pre)
if(dis[c[i]]+e[j].w==dis[e[j].v]) a[e[j].v]+=a[c[i]],a[e[j].v]%=mod;
for(int i=cnt;i;i--)
for(int j=head[c[i]];j;j=e[j].pre)
if(dis[c[i]]+e[j].w==dis[e[j].v]) b[c[i]]+=b[e[j].v],b[c[i]]%=mod;
for(int i=;i<=n;i++)
for(int j=head[i];j;j=e[j].pre)
if(dis[i]+e[j].w==dis[e[j].v]) sum[j]=(sum[j]+(long long)a[i]*b[e[j].v])%mod;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int u,v,w;scanf("%d%d%d",&u,&v,&w);
add(i,u,v,w);
}
for(int i=;i<=n;i++) Dij(i);
for(int i=;i<=m;i++) printf("%d\n",sum[i]);
return ;
}
Road(bzoj 2750)的更多相关文章
- 晨跑(bzoj 1877)
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )
To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...
- SHOI 2007 仙人掌图(BZOJ 1023)
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2564 Solved: 1062 Descrip ...
- 飞镖(bzoj 2335)
Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...
- 海拔(bzoj 2007)
Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1) ...
- 分裂游戏(bzoj 1188)
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- 弱题(bzoj 2510)
Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个 ...
- 清理雪道(bzoj 2502)
Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时 ...
随机推荐
- 万恶之源 Python
学IT真他妈难受 从早上起来坐到晚上 一天对着电脑啪啪啪
- 解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系
今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系". ...
- javascript原生方法集锦
1.sort方法sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码顺序排 ...
- FFT快速傅里叶变化
纪念人生第一次FFT 前排感谢iamzky,讲解非常详细 #include<iostream> #include<cstdio> #include<cmath> u ...
- asp发送短信验证码 pst方式
<script language="jscript" runat="server"> Array.prototype.get = function ...
- destoon模块自定义字段的添加并让其支持搜索的方法
今天看了看模块设置里的自定义字段功能的用法,试着加了个新字段glry,设置了值,然后去数据库moduleid的article表看,字段成功加上了. 于是去template下article文件夹的lis ...
- paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之enhanced coding styles
1.ANSI style 的代码比较紧凑. 下面规范推荐,比较好. 下面是带有parameter的module header的完整规范 一般1bit ,大家都是wire signal1 = gen_s ...
- ubuntu 16.04下如何打造 sublime python编程环境
一.安装python3 ubuntu自身是安装python2的,例如在ubuntu 16.04中安装的就是python2.7.但我想在python3的环境下进行开发所以就要安装python3. ...
- 2018 Multi-University Training Contest 10 CSGO(HDU - 6435)(最远曼哈顿距离)
有 n 种主武器,m 种副武器.每种武器有一个基础分数k种属性值 X[i] . 选出一种主武器 mw 和一种副武器 sw,使得两种武器的分数和 + 每个属性的差值尽量大.(参考下面的式子) 多维的最远 ...
- 加密javascript代码
最近看了个js日历,里面用到了加密,看了下,自己也模仿做加密,现在只能加密一般的javascript语句 <!DOCTYPE html> <html> <meta htt ...