题面

这题不开O2怎么过=。=

可能这种有关最短路的计数题做多了就有些感觉了......

以每个点为基准跑出一张最短路图,然后对每个边$(u,v)$统计两个东西。一个$pre[u]$表示到达$u$这个起点的路径条数,一个$nxt[v]$表示从$v$开始的最短路数,然后对每条边来一下乘法原理。

然后是这两个玩意的统计方法,$pre[]$可以在最短路图上跑拓扑排序得出,$nxt[]$可以跑记忆化搜索,这样统计的复杂度是$O(n+m)$的,总复杂度大概$O(nmlog$ $n)$?然而并不能卡过去......

 // luogu-judger-enable-o2
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
const long long mod=1e9+;
struct a{int node,dist;};
bool operator < (a x,a y)
{
return x.dist>y.dist;
}
priority_queue<a> hp;
int dis[N],vis[N],pre[N],nxt[N],deg[N],ans[M],que[N];
int p[N],noww[M],from[M],goal[M],val[M];
int n,m,t1,t2,t3,cnt,f,b;
inline int read()
{
int ret=;
char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
ret=(ret<<)+(ret<<)+(ch^),ch=getchar();
return ret;
}
void link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v,from[cnt]=f;
}
void Dijkstra(int s)
{
register int i;
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
dis[s]=,hp.push((a){s,});
while(!hp.empty())
{
a tt=hp.top(); hp.pop(); int tn=tt.node;
if(vis[tn]) continue ; vis[tn]=true;
for(i=p[tn];i;i=noww[i])
if(dis[goal[i]]>dis[tn]+val[i])
{
dis[goal[i]]=dis[tn]+val[i];
hp.push((a){goal[i],dis[goal[i]]});
}
}
}
void getpre(int nde)
{
register int i,j;
for(i=;i<=n;i++)
for(j=p[i];j;j=noww[j])
if(dis[goal[j]]==dis[i]+val[j]) deg[goal[j]]++;
que[f=b=]=nde,pre[nde]=;
while(f<=b)
{
int tn=que[f++];
for(i=p[tn];i;i=noww[i])
if(dis[goal[i]]==dis[tn]+val[i])
{
pre[goal[i]]+=pre[tn];
if(!(--deg[goal[i]])) que[++b]=goal[i];
}
}
}
void getnxt(int nde)
{
nxt[nde]=;
for(int i=p[nde];i;i=noww[i])
if(dis[goal[i]]==dis[nde]+val[i])
{
if(!nxt[goal[i]]) getnxt(goal[i]);
nxt[nde]+=nxt[goal[i]];
}
}
int main ()
{
register int i,j;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&t1,&t2,&t3),link(t1,t2,t3);
for(i=;i<=n;i++)
{
Dijkstra(i);
memset(pre,,sizeof pre);
memset(nxt,,sizeof nxt);
memset(deg,,sizeof deg);
getpre(i),getnxt(i);
for(j=;j<=m;j++)
if(dis[from[j]]+val[j]==dis[goal[j]])
ans[j]+=1ll*pre[from[j]]*nxt[goal[j]]%mod,ans[j]%=mod;
}
for(i=;i<=m;i++)
printf("%d\n",ans[i]);
return ;
}

解题:HAOI 2012 道路的更多相关文章

  1. 大暴力——[HAOI]2012音量调节

    题目:[HAOI]2012音量调节 描述: 问题描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里 ...

  2. HAOI 2012 高速公路

    https://www.luogu.org/problem/show?pid=2221 题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这 ...

  3. 【HAOI 2012】高速公路

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

  4. [HAOI 2012]音量调节

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  5. BZOJ 2749 HAOI 2012 外星人 数论 欧拉函数

    题意: 给出一个数,给出的形式是其分解质因数后,对应的质因数pi及其次数qi,问对这个数不停求phi,直至这个数变成1,需要多少次.(多组数据) 范围:pi <= 1e5,qi <= 1e ...

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

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

  7. [HAOI 2012] Road

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2750 [算法] 考虑计算每个点对每条边的贡献 对于每个点首先运行SPFA或Dijks ...

  8. [HAOI 2012] 容易题

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2751 [算法] 考虑k = 0的情况 , 根据乘法原理 : Ans = (n * ( ...

  9. [HAOI 2012] 外星人

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2749 [算法] 首先 , 每次对一个数x进行操作 , 只会使该数减少一个2的因子 那 ...

随机推荐

  1. python-模拟掷骰子,两个筛子数据可视化

    """ 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...

  2. 数据库之python操作mysql

    目录 一.pymysql 二.SQLAchemy 2.操作使用 (1)连接数据库 (2)执行原生SQL语句 (3)ORM操作-数据表操作 (4)ORM操作-数据行操作 (5)更多例子 一.pymysq ...

  3. oraclejdbc

    https://segmentfault.com/q/1010000004952621/a-1020000004955600

  4. ORM PHP 学习记录

    ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射.为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却 ...

  5. 如何将office卸载干净

    我试了控制面板卸载office软件等方法,发现一直卸载不干净. 后发现这个office的官方链接,根据这个链接的步骤就很轻松的卸载好了. https://support.office.com/zh-c ...

  6. 编写了几个Java类,但是一直运行某一个class,这种是因为:main方法写错

    编写了几个Java类,但是一直运行某一个class,这种是因为:main方法写错

  7. ADT队列/FIFO表

    队列是一种特殊的表,只在表首进行删除,只在表尾进行插入,按照先进先出原则操作(First In First Out),又称为FIFO表: 队列的指针实现代码: #include<cstdio&g ...

  8. 深入理解JAVA集合系列三:HashMap的死循环解读

    由于在公司项目中偶尔会遇到HashMap死循环造成CPU100%,重启后问题消失,隔一段时间又会反复出现.今天在这里来仔细剖析下多线程情况下HashMap所带来的问题: 1.多线程put操作后,get ...

  9. webpack命令局部运行的几种方法

    webpack命令局部运行的几种方法   1. 第一种,先全局安装webpack 命令:npm install -g webpack 然后再在项目内安装 命令:npm install webpack ...

  10. [转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此

    AMD.英特尔为何争相走向胶水多核处理器?真相在此 胶水多核到底好不好?这个事不是简单一句话能说明的,今天的超能课堂里我们就来聊聊MCM胶水多核技术的过去及未来. 作者:孟宪瑞来源:超能网|2018- ...