bzoj2750: [HAOI2012]Road

2750: [HAOI2012]Road

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 651  Solved: 302
[Submit][Status][Discuss]

Description

C国有n座城市,城市之间通过m条单向道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。

Input

第一行包含两个正整数n、m
接下来m行每行包含三个正整数u、v、w,表示有一条从u到v长度为w的道路

Output

输出应有m行,第i行包含一个数,代表经过第i条道路的最短路的数目对1000000007取模后的结果

Sample Input

4 4
1 2 5
2 3 5
3 4 5
1 4 8

Sample Output

2
3
2
1

建出最短路图。。然后答案就是起点到这个点的最短路径乘以这个点到终点的最短路径。。

但是觉得挺难写的TAT

然后发现了dij的新姿势。。

扔个链接 http://www.cnblogs.com/zyfzyf/p/3995257.html

dijkstra算法可以在算出最短路的同时将点的源点的距离排序,然后按照这个

从前往后枚举在最短路上的边可以得到源点到每个点的最短路的数目,记为a[i]

从后往前枚举在最短路上的边可以得到经过每个点有多少条最短路,记为b[i]

然后对于每条边就是 +=a[e[i].from]*b[e[i].go]

 1 #include<bits/stdc++.h>
 2 #define rep(i,l,r) for(int i=l;i<=r;++i)
 3 #define pa pair<int,int>
 4 using namespace std;
 5 const int N=5005;
 6 typedef long long ll;
 7 const ll ccz=1000000007;
 8 int head[N],tot,dis[N],u,v,w,n,m,cnt,c[N];
 9 ll a[N],b[N],ans[N];
10 struct zs{
11     int to,next,w,id;
12 }e[N];
13 bool in[N];
14 inline void ins(int u,int v,int w,int id){
15     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; e[tot].w=w; e[tot].id=id;
16 }
17 inline void run(int s){
18     priority_queue<pa,vector<pa>,greater<pa> >q;
19     memset(in,0,sizeof in);
20     memset(dis,60,sizeof dis); dis[s]=0; q.push(make_pair(0,s));
21     cnt=0;
22     while(!q.empty()){
23         int x=q.top().second; q.pop();
24         if(in[x]) continue; in[x]=1; c[++cnt]=x;
25         for(int k=head[x];k;k=e[k].next) if(dis[x]+e[k].w<dis[e[k].to]) {
26             dis[e[k].to]=e[k].w+dis[x];
27             q.push(make_pair(dis[e[k].to],e[k].to));
28         }
29     }
30     memset(a,0,sizeof a); memset(b,0,sizeof b);
31     rep(i,1,cnt) b[c[i]]=1;
32     a[s]=1;
33     rep(i,1,cnt) for(int k=head[c[i]];k;k=e[k].next) if(dis[c[i]]+e[k].w==dis[e[k].to])(a[e[k].to]+=a[c[i]])%=ccz;
34     for(int i=cnt;i;i--) for(int k=head[c[i]];k;k=e[k].next) if(dis[c[i]]+e[k].w==dis[e[k].to])(b[c[i]]+=b[e[k].to])%=ccz;
35     rep(i,1,n) for(int k=head[i];k;k=e[k].next) if(dis[i]+e[k].w==dis[e[k].to])(ans[e[k].id]+=a[i]*b[e[k].to])%=ccz;
36 }
37 int main(){
38     scanf("%d%d",&n,&m);
39     rep(i,1,m) scanf("%d%d%d",&u,&v,&w),ins(u,v,w,i);
40     rep(i,1,n) run(i);
41     rep(i,1,m) printf("%lld\n",ans[i]);
42 }

时间: 2025-01-02 13:24:04

bzoj2750: [HAOI2012]Road的相关文章

BZOJ 2750: [HAOI2012]Road( 最短路 )

对于每个点都跑最短路, 然后我们得到了个DAG, 在这DAG上更新每条边的答案. 考虑e(u, v)∈DAG对答案的贡献:  假设从S到u得路径数为A[u], 从v出发到达任意点的路径数为B[v], 那么e(u, v)的答案可以加上A[u] * B[v](显然). A可以按拓扑序递推得到, B可以通过记忆化搜索得到, 都是O(m). 所以总时间复杂度O(nmlogn + nm) -----------------------------------------------------------

bzoj 2750: [HAOI2012]Road【spfa+dfs】

枚举起点做spfa,然后一条边在最短路上的条件是dis[e[i].to]==dis[u]+e[i].va,所以每次spfa完之后,dfs出a[i]表示经过i点的最短路的起点数,b[i]表示经过i点的最短路的终点数,一条边(u,v)在当前起点下的答案就是a[u]*b[v],最终答案是总和 因为最短路构成一个DAG,所以a是按照类似拓扑序的东西来dfs的 #include<iostream> #include<cstdio> #include<queue> #include

[HAOI2012]Road

Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路.现在,这个任务交给了你. Input 第一行包含两个正整数n.m 接下来m行每行包含三个正整数u.v.w,表示有一条从u到v长度为w的道路 n≤1500.m≤5000.w≤10000 Output 输出应有m行,第i行包

【BZOJ】【2750】【HAOI2012】Road

最短路+拓扑序DP orz zyf & lyd 统计每条边在多少条最短路径上……其实可以统计 有多少条最短路径经过了x,以及y出发到达任意一个结束点有多少种走法(沿最短路) 我们可以用Dijkstra求出以 i 为起点的最短路径图,它是一个DAG,然后我们用dij扩展的顺序(一个拓扑序)来搞DP! 令a[x]表示从 i 沿最短路走到 x 的方案数,b[x]表示从 x 往出走,沿最短路走到任意一个结束结点的总方案(就是经过x的最短路条数?只不过只看后半段) 其实就是将最短路分开两半进行统计了……然

图论①

2750: [HAOI2012]Road Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 651  Solved: 302[Submit][Status][Discuss] Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路

【BZOJ2752】[HAOI2012]高速公路(road) 线段树

[BZOJ2752][HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政

BZOJ2752: [HAOI2012]高速公路(road)

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][Status] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行

【BZOJ 2752】 [HAOI2012]高速公路(road)

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MB Submit: 791 Solved: 282 [Submit][Status][Discuss] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1

BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit][Status][Discuss] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1