bzoj2750Road——最短路计数
题目: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——最短路计数的更多相关文章
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...
- P1144 最短路计数
P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 2018.11.05 NOIP模拟 规避(最短路计数)
传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...
- 洛谷 P1144 最短路计数 解题报告
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...
- BZOJ1632: [Usaco2007 Feb]Lilypad Pond SPFA+最短路计数
Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...
- 1491. [NOI2007]社交网络【最短路计数】
Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...
- 洛谷P1144 最短路计数 及其引申思考
图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...
随机推荐
- HDU 5304(Eastest Magical Day Seep Group's Summer-环加外向树生成树计数)[Template:Kirchhoff矩阵]
Eastest Magical Day Seep Group's Summer Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 655 ...
- py3处理数据库
处理mysql使用 pymysql模块 import pymysql conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passw ...
- Spring集成JDBC
不同spring版本合成的方式,有时候不一样,需要查看帮助文档来看如何集成,帮助文档在spring发行包中. 1.导入spring的包(这里吧Spring-3.1.3 Release的所有jar包都导 ...
- SDUT 1068-Number Steps(数学:直线)
Number Steps Time Limit: 1000ms Memory limit: 10000K 有疑问?点这里^_^ 题目描写叙述 Starting from point (0,0) ...
- Gson解析数组和list容器
Gson解析数组和list容器 使用Gson解析首先须要增加架包文件:gson-2.2.4.jar 定义一个类Student: public class Student { String name=& ...
- 使用Python与数据库交互
# -*- coding: utf-8 -*- """ Created on Sun Nov 18 19:25:01 2018 @author: wangm " ...
- vmware workstation14永久激活密钥
vmware workstation14永久激活密钥分享: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3WK-AFXEK-488JP-A7MQX-XL8YF AC5XK-0ZD4 ...
- 挂断电话demo
<!-- 结束通话和打电话的权限 --> <uses-permission android:name="android.permission.CALL_PHONE" ...
- HTML中级教程 自定义列表
在HTML初级教程中我们教授了无序列表和有序列表,很不幸,很像Peter Cushing的博士Who,自定义列表很容易被忽略.可能是因为自定义列表需要比无序列表和有序列表更多的设置和似乎更少用.当遭遇 ...
- LightOJ - 1104 Birthday Paradox —— 概率
题目链接:https://vjudge.net/problem/LightOJ-1104 1104 - Birthday Paradox PDF (English) Statistics For ...