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

以每个点作为源点,spfa跑出一个最短路图(不一定是树,因为可能很多条最短路一样长);

对于图中的每条边,需要知道从源点到边起点的方案数和边终点的size;

所以对于每张图都dfs求一遍所有点的两个值:从源点到它的方案数(a),它以下的size(b);

由于不能破坏原图,所以可以通过dis[edge[i].to]==dis[edge[i].hd]+edge[i].w来判断这条边是否在最短路图中。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int const MAXN=,MAXM=,P=1e9+;
int n,m,head[MAXN],ct,dis[MAXN],p[MAXN];
long long ans[MAXM],a[MAXN],b[MAXN];
bool vis[MAXN],f[MAXN];
struct N{
int hd,to,next,w;
N(int h=,int t=,int n=,int w=):hd(h),to(t),next(n),w(w) {}
}edge[MAXM];
void spfa(int s)
{
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
while(q.size())q.pop();
q.push(s);dis[s]=;vis[s]=;
while(q.size())
{
int x=q.front();q.pop();vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
dis[u]=dis[x]+edge[i].w;
if(!vis[u])vis[u]=,q.push(u);
}
}
}
}
void dfs1(int x)
{
f[x]=;
for(int i=head[x],u;i;i=edge[i].next)
if(dis[u=edge[i].to]==dis[x]+edge[i].w)
{
p[u]++;
if(!f[u])dfs1(u);
}
}
void dfs2(int x)
{
for(int i=head[x],u;i;i=edge[i].next)
if(dis[u=edge[i].to]==dis[x]+edge[i].w)
{
a[u]=(a[u]+a[x])%P;p[u]--;//拓扑
if(!p[u])dfs2(u);
}
}
void dfs3(int x)
{
b[x]=;
for(int i=head[x],u;i;i=edge[i].next)
if(dis[u=edge[i].to]==dis[x]+edge[i].w)
{
if(!b[u])dfs3(u);//记忆化
b[x]=(b[x]+b[u])%P;
}
}
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[++ct]=N(x,y,head[x],z);head[x]=ct;
}
for(int i=;i<=n;i++)
{
spfa(i);
memset(f,,sizeof f);
memset(a,,sizeof a);
memset(b,,sizeof b);
dfs1(i);a[i]=;dfs2(i);dfs3(i);
for(int j=,u,v;j<=m;j++)
if(dis[v=edge[j].to]==dis[u=edge[j].hd]+edge[j].w)
ans[j]=(ans[j]+a[u]*b[v])%P;
}
for(int j=;j<=m;j++)
printf("%lld\n",ans[j]);
return ;
}

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

  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. Lightoj 1088 - Points in Segments 【二分】

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1088 题意: 有一维的n个点和q条线段.询问每条线段上的点有多少个. 思路:寻 ...

  2. 第十六周 项目三-max带来的冲突

    分析以下程序出现的编译错误,给出解决的方案. #include<iostream> using namespace std; //定义函数模板 template<class T> ...

  3. java new一个接口到底要做什么

    转自:http://www.cnblogs.com/yjmyzz/p/3448330.html java中的匿名类有一个倍儿神奇的用法,见下面代码示例: 1 package contract; 2 3 ...

  4. 由于扩展配置问题而无法提供您请求的页面...请添加 MIME 映射.--解决方法

    http://blog.sina.com.cn/s/blog_4c78de680100quis.html HTTP 错误 404.3 - Not Found由于扩展配置问题而无法提供您请求的页面.如果 ...

  5. Plug and Play

    http://baike.baidu.com/view/33701.htm 即插即用 编辑   PNP是Plug-and-Play(即插即用)的缩写.它的作用是自动配置(低层)计算机中的板卡和其他设备 ...

  6. Java、C++、Python、Ruby、PHP、C#和JavaScript的理解

    Java.C++.Python.Ruby.PHP.C#和JavaScript和日本动漫里的那些大家熟悉的动漫人物结合起来.依据他们的身世.个人经历来生动的表达各编程语言的发展历程.原文内容例如以下:  ...

  7. Android版App的控件元素定位

    前言 如何获取页面上各控件元素,无论是Web自动化还是App自动化,此步骤都是非常关键的! Web页面的控件元素可通过开发者选项(Chrome浏览器的F12)来协助定位,App端也是有相应的工具来协助 ...

  8. Android自动折行TextView Group

    package com.test.testview; import java.util.ArrayList; import android.content.Context; import androi ...

  9. Linux系统目录数和文件数限制

    对于系统管理员来说,了解系统的一些限制是非常有必要的,这样可以根据需要进行必要的参数配置和调整,进而实现更优的性能,对于系统设计人员甚至程序员来说,了解系统的一些限制,也会有助于设计更为合理的存储结构 ...

  10. 并发回射服务器的最基本实现思路( fork )

    前言 一个服务器,通常会在一段时间内接收到多个请求.如果非要等到处理完一个请求再去处理下一个,势必会造成大部分用户的不满( 尤其当有某个请求需要占用大量时间时 ).如何解决这个问题?让处理这些用户请求 ...