[HAOI2012]道路
题目描述
C国有n座城市,城市之间通过m条[b]单向[/b]道路连接。一条路径被称为最短路,当且仅当不存在从 它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多 少条不同的最短路经过该道路。现在,这个任务交给了你。
输入输出格式
输入格式:
第一行包含两个正整数n、m
接下来m行每行包含三个正整数u、v、w,表示有一条从u到v长度为w的道路
输出格式:
输出应有m行,第i行包含一个数,代表经过第i条道路的最短路的数目对[b]1000000007取模[/b]后的结果
输入输出样例
说明
数据规模
30%的数据满足:n≤15、m≤30
60%的数据满足:n≤300、m≤1000
100%的数据满足:n≤1500、m≤5000、w≤10000
以每一个点为起点,做一次SPFA,把在最短路上的边标记
设S到i的路径数cnt1[i],在设i到其他点的最短路数cnt2[i]
因为选出来的边构成的图无环,所以用拓扑排序来递推
cnt1[v]+=cnt1[u]
至于cnt2数组,用逆拓扑序递推
于是一条边(u,v)的ans+=cnt1[u]*cnt2[v]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct Node
{
int next,to,dis;
}edge[];
int num,head[],d[];
long long cnt1[],cnt2[],ans[],n,m;
int q[];
bool vis[],pd[];
long long dist[];
int Mod=;
void add(int u,int v,int d)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].dis=d;
}
void SPFA(int S)
{queue<int>Q;
int i,j;
memset(pd,,sizeof(pd));
memset(vis,,sizeof(vis));
memset(dist,/,sizeof(dist));
memset(d,,sizeof(d));
Q.push(S);
dist[S]=;
while (Q.empty()==)
{
int u=Q.front();
Q.pop();
vis[u]=;
for (i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (dist[v]>dist[u]+edge[i].dis)
{
dist[v]=dist[u]+edge[i].dis;
if (vis[v]==)
{
vis[v]=;
Q.push(v);
}
}
}
}
for (i=;i<=n;i++)
for (j=head[i];j;j=edge[j].next)
if (dist[i]+edge[j].dis==dist[edge[j].to])
pd[j]=,d[edge[j].to]++;
}
void Top_sort(int S)
{int i,j;
memset(cnt1,,sizeof(cnt1));
memset(cnt2,,sizeof(cnt2));
int h=,t=;
q[]=S;
cnt1[S]=;
while (h<t)
{
h++;
int u=q[h];
for (i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (pd[i])
{
d[v]--;
cnt1[v]+=cnt1[u];
cnt1[v]%=Mod;
if (d[v]==)
{
t++;
q[t]=v;
}
}
}
}
for (i=t;i>=;i--)
{
int u=q[i];
cnt2[u]++;
for (j=head[u];j;j=edge[j].next)
if (pd[j])
{
int v=edge[j].to;
cnt2[u]+=cnt2[v];
cnt2[u]%=Mod;
}
}
for (i=;i<=n;i++)
for (j=head[i];j;j=edge[j].next)
if (pd[j])
{
int v=edge[j].to;
ans[j]+=cnt1[i]*cnt2[v];
ans[j]%=Mod;
}
}
int main()
{int i,u,v,d;
cin>>n>>m;
for (i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&d);
add(u,v,d);
}
for (i=;i<=n;i++)
{
SPFA(i);
Top_sort(i);
}
for (i=;i<=m;i++)
printf("%lld\n",ans[i]);
}
[HAOI2012]道路的更多相关文章
- 洛谷 P2505 [HAOI2012]道路 解题报告
P2505 [HAOI2012]道路 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它 ...
- JZYZOJ1525 HAOI2012道路 堆优化的dijkstra+pair
From Tyvj Guest ☆[haoi2012]道路 描述 Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当 ...
- [HAOI2012]道路(最短路DAG上计数)
C国有n座城市,城市之间通过m条[b]单向[/b]道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我们需要对每 ...
- 洛谷P2505 [HAOI2012]道路(最短路计数)
传送门 早上模拟赛考这题,结果竟然看错题目了orz 然后下午看完题解自己做的时候空间开小了白WA了好久orz 首先,如果以$S$为起点,一条边$(u,v)$在最短路上,则$dis[u]+edge[i] ...
- 洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树
https://www.luogu.org/problemnew/show/P2505 https://www.lydsy.com/JudgeOnline/problem.php?id=2750 神奇 ...
- P2505 [HAOI2012]道路
传送门 统计每条边被最短路经过几次,点数不大,考虑计算以每个点为起点时对其他边的贡献 对于某个点 $S$ 为起点的贡献,首先跑一遍最短路,建出最短路的 $DAG$ 考虑 $DAG$ 上的某条边被以 $ ...
- 题解 [HAOI2012]道路
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的有向图,问每一条边在多少个最短路径中出现. \(n\le 1500,m\le 5000\) 思路 算我孤陋寡闻了... 很显然,我们 ...
- test20190829 神大校赛模拟
100+100+0=200,聪明搬题人题面又出锅了. 最短路径(path) 给定有向图,包含 n 个节点和 m 条有向边. 一条A 到 B 的路径是最短路径当且仅当不存在另一条从A 到 B 的路径比它 ...
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
随机推荐
- Java连接mysql——Establishing SSL connection without server's identity verification is not recommended.
Establishing SSL connection without server's identity verification is not recommended. 出现这个错误的原因是因为m ...
- JAVA接口基础知识总结
1:是用关键字interface定义的. 2:接口中包含的成员,最常见的有全局常量.抽象方法. 注意:接口中的成员都有固定的修饰符. 成员变量:public static final 成员方法 ...
- 201621123027 Week02-Java基本语法与类库
Week02-Java基本语法与类库 1.本周学习总结 关键词:基本语法,数据类型,包装类 本周讲了Java的基本数据类型和包装类: 数据类型主要分为八类(byte,short,int,long,do ...
- loadrunner下载资源时步骤下载超时 (120 seconds) 已过期
下载资源所用时间超过120秒时,就会报出这个错误,解决方法是设置加大超时时间 运行时设置(快捷键F4) Internet 协议--首选项--高级--选项--General--步骤下载超时(秒) 可以把 ...
- 织梦cms网上复制图片不可用的解决方法
背景描述: 织梦cms采集图片集时, 需要使用织梦cms提供的"网上复制图片"的功能, 好像我这里这个功能一直不可用, 今天下定决心研究了下源代码并进行了适当修改, 将我的修改提供 ...
- JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别
黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看 JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...
- django报错invalid literal for int() with base 10: ''
这种错误是因为模型类中某个字段的条件约束为int类型,但是给了一个字符串类型,所以报错,找到那个模型类的字段,并对应修改就好了.
- HDFS文件读写操作(基础基础超基础)
环境 OS: Ubuntu 16.04 64-Bit JDK: 1.7.0_80 64-Bit Hadoop: 2.6.5 原理 <权威指南>有两张图,下次po上来好好聊一下 实测 读操作 ...
- centos7.4下离线安装CDH5.7
(一)安装前的规划 (1)操作系统版本:centos7.4(64bit) [root@hadoop22 etc]# more /etc/centos-release CentOS Linux rele ...
- Web Api 接收图片
public async Task<HttpResponseMessage> Upload() { if (!Request.Content.IsMimeMultipartContent( ...