bzoj2750最短路计数
题目: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最短路计数的更多相关文章
- 【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开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...
随机推荐
- Linux 笔记 #04# Installing Tomcat 8 on Debian
失败一 ※ 失败二 ※ 失败三 ※ 完 1- 确认机型: root@iZwz:~# lsb_release -a LSB Version: core-2.0-amd64:core-2.0-noarc ...
- 前端学习笔记之CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解
派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...
- SQL学习笔记四(补充-2)之MySQL多表查询
阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table depart ...
- 20145322 何志威《网络对抗》shellcode注入&Return-to-libc攻击深入
基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. execstack - ...
- ZLYD团队第一周项目总结
ZLYD团队第一周项目总结 团队项目 项目内容:我们打算利用Applet实现一个吃豆子游戏,团队初步设定游戏规则如下: 按空格键,游戏开始: 通过方向键控制吃豆者的运动方向,直到吃光所有金豆子: 吃到 ...
- 解决 Faster R-CNN 图片中框不在一张图片上显示的问题
目录 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 如何解决这个问题? 参考issues 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 在使 ...
- hdu 1004 Let the Balloon Rise strcmp、map、trie树
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- hdu 2841 Visible Trees 容斥原理
Visible Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- Windows服务程序_测试01
1. #include <stdio.h> #include <Windows.h> #include <tchar.h> #include <process ...
- 【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?
原文链接:http://www.51testing.com/html/49/n-3721249.html 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?loc ...