题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2750

枚举每一个起点,通过该边的子树中有多少节点就知道本次它被经过几次了;

  因为同一起点到该边的起点的最短路唯一。

但其实不是!就在于可以有长度相等的最短路!

所以暴力通过dis[cur]+edge[ i ].w==dis[ v ]?来判断该边是否在当前最短路中。

记录从根到该边起点有多少路径时要保证指向它的点都已赋过值,所以拓扑一下。

别忘了到处写上那个暴力判断!

关于rd,别忘了赋初值。只要每次赋rd[cur]=0就行了。其它会在更新dis时赋好。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=,M=,mod=1e9+;
int n,m,head[N],pre[N],dis[N],xnt,rd[N];
ll d1[N],d2[N],ans[M];
bool in[N];
queue<int> r;
struct Edge{
int next,from,to,w;
Edge(int n=,int f=,int t=,int w=):next(n),from(f),to(t),w(w) {}
}edge[M];
void spfa(int cur)
{
memset(dis,,sizeof dis);
queue<int> q;
dis[cur]=;q.push(cur);in[cur]=;rd[cur]=;//
while(q.size())
{
int k=q.front();q.pop();in[k]=;
for(int i=head[k],v;i;i=edge[i].next)
{
if(dis[k]+edge[i].w==dis[v=edge[i].to])rd[v]++;
if(dis[k]+edge[i].w<dis[v=edge[i].to])
{
rd[v]=;
dis[v]=dis[k]+edge[i].w;
if(!in[v])q.push(v),in[v]=;
}
}
}
}
void dp(int cur)
{
d2[cur]=;
for(int i=head[cur],v;i;i=edge[i].next)
if(dis[v=edge[i].to]==dis[cur]+edge[i].w)
{
if(!d2[v=edge[i].to])dp(v);
(d2[cur]+=d2[v])%=mod;
}
}
void tp(int cur)
{
r.push(cur);
for(int i=head[cur],v;i;i=edge[i].next)
if(dis[v=edge[i].to]==dis[cur]+edge[i].w)//
{
rd[v=edge[i].to]--;
if(!rd[v])tp(v);
}
}
void solve(int cur)
{
// printf("cur=%d\n",cur);
memset(d1,,sizeof d1);
memset(d2,,sizeof d2);
while(r.size())r.pop();
spfa(cur);
tp(cur);
dp(cur);
d1[cur]=;
while(r.size())
{
int k=r.front();r.pop();
for(int i=head[k],v;i;i=edge[i].next)
if(dis[v=edge[i].to]==dis[k]+edge[i].w)
(d1[v]+=d1[k])%=mod;
}
for(int i=,u,v;i<=m;i++)
if(dis[u=edge[i].from]+edge[i].w==dis[v=edge[i].to])//
{
(ans[i]+=d1[u]*d2[v])%=mod;
// printf("from=%d to=%d t=%lld ans=%lld\n",edge[i].from,edge[i].to,d2[edge[i].to],ans[i]);
}
}
int main()
{
scanf("%d%d",&n,&m);int x,y,z;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge[++xnt]=Edge(head[x],x,y,z);head[x]=xnt;
}
for(int i=;i<=n;i++)
solve(i);
for(int i=;i<=m;i++)
printf("%lld\n",ans[i]);
return ;
}

bzoj2750最短路计数的更多相关文章

  1. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  2. P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

  3. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  4. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  5. 2018.11.05 NOIP模拟 规避(最短路计数)

    传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...

  6. 洛谷 P1144 最短路计数 解题报告

    P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...

  7. BZOJ1632: [Usaco2007 Feb]Lilypad Pond SPFA+最短路计数

    Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...

  8. 1491. [NOI2007]社交网络【最短路计数】

    Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...

  9. 洛谷P1144 最短路计数 及其引申思考

    图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...

随机推荐

  1. 《Java入门第二季》第二章 封装

    什么是java中的封装1.封装的概念:隐藏信息.隐藏具体的实现细节. 2.封装的实现步骤: 1)修改属性的可见性,private.2)创建修改器方法和访问器方法,getXXX/setXXX.(未必一定 ...

  2. Linux内核分析07

    可执行程序的装载 一,预处理.编译.链接和目标文件的格式 可执行程序是怎么来的? 预处理  把include里的宏定义替换 做字符串处理. efl格式? 目标文件格式,Windows中用PE Linu ...

  3. 如何在编辑框中使用IAutoComplete接口(转载)

    出自:http://www.vckbase.com/index.php/wv/27.html 如果可能我想用打包类来实现.唉!,就叫我封装先生吧. 你算是找对地方了.但是我要先声明我的解决办法不是你所 ...

  4. 实时刷新winform中的某一个控件上的文字

    需要注意的是,必须从UI线程,另外启动一个线程才可以. 在新线程调用异步刷新就OK了 Thread thread; private void button1_Click(object sender, ...

  5. UOJ #164 【清华集训2015】 V

    题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\) 同时这种标记也是 ...

  6. shell 按行读取文件

    #!/bin/bash count= //赋值语句,不加空格 cat test | while read line //cat 命令的输出作为read命令的输入,read读到的值放在line中 do ...

  7. python 三维数组找最小值

    #声明三维数组 num=[[[,,],[,,],[,,]], \ [[,,],[,,],[,,]]] value=num[][][]#设置main为num数组的第一个元素 ): ): ): if(va ...

  8. ContentNegotiatingViewResolver多种输出格式实例: json/jsp/xml/xls/pdf

    ContentNegotiatingViewResolver多种输出格式实例: json/jsp/xml/xls/pdf 本例用的是javaConfig配置 以pizza为例. json输出需要用到的 ...

  9. Spring的JdbcTemplate实现分页

    PageList.java实体类 /** * 封装分页对象 **/ public class PageList { private int page; //当前页 private int totalR ...

  10. Tornado源码分析 --- 静态文件处理模块

    每个web框架都会有对静态文件的处理支持,下面对于Tornado的静态文件的处理模块的源码进行分析,以加强自己对静态文件处理的理解. 先从Tornado的主要模块 web.py 入手,可以看到在App ...