BZOJ 2750 HAOI 2012 Road 高速公路 最短路
题意:
给出一个有向图,求每条边有多少次作为最短路上的边(任意的起始点)。
范围:n <= 1500, m <= 5005
分析:
一个比较容易想到的思路:以每个点作为起点,做一次SPFA,记f[i]表示从点S到达点i的最短路数,g[i]表示从点i到达点T的最短路数。
那么对于任意一条边,答案就是∑f[u]*g[v]
剩下的问题就是f、g怎么求。
f必须从前面的递推过来,如果前面的没有递推完,那么就不能递推当前点,需要记录每个点可以从多少个点递推过来,这个一次dfs就可以完成。
g可以记忆化搜索来做,先把后继的全部递推完,再递推当前点,就是反过来递推。
程序:
#include <bits/stdc++.h> using namespace std; #define REP(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define REP_EDGE(i, a) for (int i = (a); i != -1; i = e[i].nxt)
#define mset(a, b) memset(a, b, sizeof(a))
const int maxn = , maxm = , INF = 0x3fffffff, MOD = 1e9+;
typedef long long LL;
int n, m;
struct Edge
{
int u, v, w, nxt;
Edge (int u = , int v = , int w = , int nxt = ): u(u), v(v), w(w), nxt(nxt) {}
}e[maxm];
int head[maxn], label;
int dist[maxn], s_pre[maxn], f[maxn], g[maxn], ans[maxm];
bool vis[maxn];
queue <int> q; void ins(int u, int v, int w) { e[++label] = Edge(u, v, w, head[u]), head[u] = label; } void SPFA(int S)
{
REP(i, , n) dist[i] = INF, vis[i] = false;
vis[S] = true, dist[S] = , q.push(S);
while (!q.empty())
{
int u = q.front();
vis[u] = false, q.pop();
REP_EDGE(i, head[u])
{
int v = e[i].v, w = e[i].w;
if (dist[v] > dist[u]+w)
{
dist[v] = dist[u]+w;
if (!vis[v])
vis[v] = true, q.push(v);
}
}
}
} void find_pre(int u)
{
REP_EDGE(i, head[u])
{
int v = e[i].v, w = e[i].w;
if (dist[v] == dist[u]+w)
{
s_pre[v] ++;
if (!vis[v]) vis[v] = true, find_pre(v);
}
}
} void find_f(int u)
{
REP_EDGE(i, head[u])
{
int v = e[i].v, w = e[i].w;
if (dist[v] == dist[u]+w)
{
f[v] = (f[v]+f[u])%MOD;
if (--s_pre[v] == ) find_f(v);
}
}
} void find_g(int u)
{
g[u] = ;
REP_EDGE(i, head[u])
{
int v = e[i].v, w = e[i].w;
if (dist[v] == dist[u]+w)
{
if (!g[v]) find_g(v);
g[u] = (g[u]+g[v])%MOD;
}
}
} int main()
{
scanf("%d %d", &n, &m);
REP(i, , n) head[i] = -;
label = ;
REP(i, , m)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
ins(u, v, w);
}
REP(i, , n)
{
SPFA(i);
mset(vis, ), mset(s_pre, ), mset(f, ), mset(g, );
vis[i] = true, find_pre(i);
f[i] = , find_f(i), find_g(i);
REP(j, , m)
if (dist[e[j].u]+e[j].w == dist[e[j].v])
ans[j] = (ans[j]+((LL)f[e[j].u]*g[e[j].v])%MOD)%MOD;
}
REP(i, , m) printf("%d\n", ans[i]);
return ;
}
BZOJ 2750 HAOI 2012 Road 高速公路 最短路的更多相关文章
- [HAOI 2012] Road
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2750 [算法] 考虑计算每个点对每条边的贡献 对于每个点首先运行SPFA或Dijks ...
- 【HAOI 2012】高速公路
Problem Description \(Y901\) 高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. \(Y901\) ...
- BZOJ 2749 HAOI 2012 外星人 数论 欧拉函数
题意: 给出一个数,给出的形式是其分解质因数后,对应的质因数pi及其次数qi,问对这个数不停求phi,直至这个数变成1,需要多少次.(多组数据) 范围:pi <= 1e5,qi <= 1e ...
- 大暴力——[HAOI]2012音量调节
题目:[HAOI]2012音量调节 描述: 问题描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里 ...
- [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)
[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...
- [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...
- BZOJ 2750: [HAOI2012]Road( 最短路 )
对于每个点都跑最短路, 然后我们得到了个DAG, 在这DAG上更新每条边的答案. 考虑e(u, v)∈DAG对答案的贡献: 假设从S到u得路径数为A[u], 从v出发到达任意点的路径数为B[v], ...
- bzoj 2750: [HAOI2012]Road
Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ...
- HAOI 2012 高速公路
https://www.luogu.org/problem/show?pid=2221 题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这 ...
随机推荐
- 【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1
记录一下day6发生的事情吧. 7:30 到达附中求索碑,被人膜,掉RP. 7:50 进考场,6楼的最后一排的最左边的位置,世界上最角落的地方,没有任何想法. 发现电脑时间和别人不一样,赶快调了一下. ...
- php环境搭建 (window环境下 eclipse+Wampserver)
看了好多的环境搭建感觉好复杂呀,自己搞了一下简单的可以用了 php的手册 http://www.php.net/manual/zh/ 一,下载 1,下载eclipse http://www.ecl ...
- VirtualBox上安装CentOS-7(Minimal)
Windows 10家庭中文版,VirtualBox 5.2.12,CentOS 7(Minimal版), 因为听到大家在谈论CentOS,阿里云上也有CentOS,CentOS还是Red Hat出品 ...
- 使用Dockerfile构建docker lnmp环境
一.mysql 1.创建 Dockerfile mkdir mysql # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd mysql # 进入目录 vi Dockerfile # 创 ...
- java基础21 System类和Runtime类
一.System系统类 1.1.System系统类 主要用于获取系统信息 1.2.System类的常用方法 arraycopy(Object src, int srcPos, Object dest, ...
- 洛谷P2886牛继电器
传送门啦 倍增 $ Floyd $ 注意结构体里二维数组不能开到 $ 2000 $ #include <iostream> #include <cstdio> #include ...
- C++ 实现memcpy和strcpy
/** * @Method: Memcpy * @Access: public * @Return: void * * @Param : dst - 目的起始地址 * @Param : src - 源 ...
- SQl查询数据库库名,表名、表的列名
查询数据库 select * From master.dbo.sysdatabases where name='数据库名' and status<>512 --读取库中的所有表名 (当 ...
- 转58同城 mysql规范
这里面都是一些很简单的规则,看似没有特别大的意义,但真实的不就是这么简单繁杂的工作吗? 军规适用场景:并发量大.数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一.基础规范 ( ...
- hdu 4349 求C(n,0),C(n,1),C(n,2)...C(n,n).当中有多少个奇数 (Lucas定理推广)
Lucas定理:把n写成p进制a[n]a[n-1]a[n-2]...a[0],把m写成p进制b[n]b[n-1]b[n-2]...b[0],则C(n,m)与C(a[n],b[n])*C(a[n-1], ...