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

Solution

我们要求每条边上最短路经过的数量,看上去非常不好求,但注意到点数只有1500,边数只有5000,可以考虑枚举源点,把所有答案加起来就是最后的答案。

问题来了,对于确定的原点,我们怎么计数?

这时我们可以考虑在DAG上弄一弄。

我们将dp[S]=1,只把S加入队列,跑一边拓扑,dp[v]+=dp[u](这时对于最短路DAG上的)。

在按照拓扑序反着来一遍,dp[u]+=dp[v](初始所有dp[u]=1)。

然后我就在想一个问题,为什么逛公园那题必须把所有入度为0的点加入队列,而这个题只能把S加入队列。

原因是:逛公园那题需要判0环,如果只加入S,会出现BUG,这题要计数,把所有点加进去会多算一些东西。

图论就是这么奇妙23333

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define N 1503
#define M 5002
#define wj 1000000007
#define mm make_pair
#define R register
using namespace std;//对与每个点有多少最短路经过该点。
int u,v,w,dis[N],head[N],tot,n,m,du[N],st[N],top,pd[M];
long long dp[N],dp2[N],ans[M];
bool vis[N];
queue<int>q;
struct fe{
int n,to,l;
}e[M];
inline void add(R int u,R int v,R int l){
e[++tot].n=head[u];
e[tot].to=v;
head[u]=tot;e[tot].l=l;
}
int rd(){
int x=;
char c=getchar();while(!isdigit(c))c=getchar();
while(isdigit(c)){
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return x;
}
int main(){
n=rd();m=rd();
for(int i=;i<=m;++i){
u=rd();v=rd();w=rd();
add(u,v,w);
}
for(R int S=;S<=n;++S){
q.push(S);
memset(dis,0x3f,sizeof(dis));dis[S]=;
memset(vis,,sizeof(vis)); top=;
memset(dp,,sizeof(dp));memset(dp2,,sizeof(dp2));
while(!q.empty()){
R int u=q.front();q.pop();vis[u]=;
for(R int i=head[u];i;i=e[i].n){
R int v=e[i].to;
if(dis[v]>dis[u]+e[i].l){
dis[v]=dis[u]+e[i].l;
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
memset(pd,,sizeof(pd));
for(int u=;u<=n;++u)
for(int i=head[u];i;i=e[i].n)
if(dis[e[i].to]==dis[u]+e[i].l)du[e[i].to]++,pd[i]=;
dp[S]=;q.push(S);
while(!q.empty()){
int u=q.front();q.pop();st[++top]=u;
for(R int i=head[u];i;i=e[i].n)if(pd[i]){
if(!--du[e[i].to])q.push(e[i].to);(dp[e[i].to]+=dp[u])%=wj;
}
}
for(R int i=top;i>=;--i){
dp2[st[i]]=;
for(R int j=head[st[i]];j;j=e[j].n)if(pd[j])
(dp2[st[i]]+=dp2[e[j].to])%=wj;
}
for(R int u=;u<=n;++u)
for(R int i=head[u];i;i=e[i].n)if(pd[i])(ans[i]+=dp[u]*dp2[e[i].to])%=wj;
}
for(R int i=;i<=tot;++i)printf("%d\n",ans[i]);
return ;
}

[HAOI2012]道路(最短路DAG上计数)的更多相关文章

  1. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  2. Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)

    题意:给出一张有向图,每条边有长度,对于每条边,你要回答将该边的方向取反后,从起点到终点的最短距离是增加or减小or不变. 首先求出起点到所有点的最短距离和所有点到终点的最短距离(两次DIjkstra ...

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

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

  4. 洛谷 P2505 [HAOI2012]道路 解题报告

    P2505 [HAOI2012]道路 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它 ...

  5. DAG上动态规划

    很多动态规划问题都可以转化为DAG上的最长路,最短路,或路径计数问题. 硬币问题: 有N中硬币,面值分别为v1,v2,v3,……vn,每种都无穷多,给定非负整数S,可以选用多少个硬币,使他们的总和恰好 ...

  6. 最短路DAG

    边权皆为正时,有最短路DAG. 最短路DAG代表了从原点到每个点的所有最短路. 最短路树个数=最短路DAG生成树个数.用DAG生成树计数即可.复杂度\(O(n+m)\).

  7. DAG 上的动态规划(训练指南—大白书)

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.矩形嵌套 题目描述:       ...

  8. 有标号的DAG图计数1~4

    前言 我什么都不会,菜的被关了起来. 有标号的DAG图I Solution 考虑递推,设\(f_i\)表示i个点的答案,显然这个东西是可以组合数+容斥递推? 设\(f_i\)表示i个点的答案,我们考虑 ...

  9. JZYZOJ1525 HAOI2012道路 堆优化的dijkstra+pair

    From Tyvj Guest ☆[haoi2012]道路                 描述 Description     C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当 ...

随机推荐

  1. linux如何查看所有的用户(user)、用户组(group)、密码(password/passwd)

    linux如何查看所有的用户和组信息_百度经验https://jingyan.baidu.com/article/a681b0de159b093b184346a7.html linux添加用户.用户组 ...

  2. virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntu

    virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntuhttps://askubuntu.com/questi ...

  3. Web系统大规模并发——秒杀与抢购 秒杀系统优化与预防措施

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  4. JS 验证输入框输入 只允许输入正实数(正整数,正小数),其他情况下不能输入 oninput事件

    input标签的oninput事件 要求输入框只输入正实数,包括整数和小数. 具体要求:整数部分不超过7位,可以没有小数,若有位数不超过2位. <input type="text&qu ...

  5. ORA-12541:TNS:无监听程序 解决办法

    昨天我在一台win7笔记本中安装了oracle11g,然后打算用另一个win10的笔记本使用plsql developer局域网内连接访问oracle数据库.但是遇到ORA-12541:TNS:无监听 ...

  6. CLOUD不审核修改物料

  7. 动态渲染页面爬取(Python 网络爬虫) ---Selenium的使用

    Selenium 的使用 Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击.下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬.对于一些JavaS ...

  8. idea的pom.xml中提示dependency‘’not found

    今天下午在更新svn上的项目到本地,发现pom文件中的如下依赖的version一直标红,鼠标放上去显示“dependency not found.” 同时检查了Maven Projects中该项目引入 ...

  9. CSS3之box-sizing属性

    box-sizing本身有三个属性:content-box(默认).border-box和padding-box. content-box:border与padding均不算入width中: bord ...

  10. Xamarin 简化的Android密钥库签名

    安装 开始使用这个新工具不容易.在Visual Studio 2017(即将推出VS 2015),只需转到工具 - >扩展和更新,并搜索“密钥库”来查找扩展名. 下载后,只需重新启动Visual ...