题目: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 ;
}

最新文章

  1. 优化MySchool数据库设计
  2. Mathematics:Pseudoprime numbers(POJ 3641)
  3. How do I uninstall Java 7 and later versions on my Mac?
  4. java 泛型思考
  5. Eclipse 和 HSQLDB: 将关系数据库服务器嵌入到 Eclipse 中,第 2 部分
  6. Unity3D 多平台 预编译 宏定义
  7. Android中内容观察者的使用---- ContentObserver类详解
  8. Python超级程序员使用的开发工具
  9. Oracle 常用的SQL语法和数据对象
  10. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.1
  11. iOS &amp;quot;The sandbox is not in sync with the Podfile.lock&amp;quot;解决方式
  12. APP类别之比较与分析
  13. [POI 2004]SZP
  14. php仿经典省市县三级联动
  15. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现
  16. IntelliJ IDEA安装bower
  17. jquery移除事件,绑定事件,触发事件
  18. AJPFX简述:MetaTrader 4移动交易平台
  19. 实操重写IK分词器源码,基于mysql热更新词库
  20. python标准数据类型 Bytes

热门文章

  1. Python笔记 #08# NumPy: Statistic Basis
  2. ubuntu/centos/mac/windows 使用阿里源加速docker镜像下载
  3. 初识PHP(一)基础语法
  4. linux体系结构与内核结构图解
  5. 图解Git命令【转】
  6. linux下如何退出tmux和重新进入tmux
  7. HDU 2896 病毒侵袭(AC自动机)题解
  8. Bootstrap and Angular
  9. Spring IOC容器的初始化流程
  10. js 杂谈