zoukankan      html  css  js  c++  java
  • [HAOI2012]Road

    2750: [HAOI2012]Road

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 728  Solved: 349
    [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

    HINT

    数据规模

    30%的数据满足:n≤15、m≤30

    60%的数据满足:n≤300、m≤1000

    100%的数据满足:n≤1500、m≤5000、w≤10000

    Source

     显示代码纯文本

    1. #include<cstdio>
    2. #include<cstring>
    3. #include<queue>
    4. #define pir pair<int,int>
    5. using namespace std;
    6. const int N=10010;
    7. const int inf=0x3f3f3f3f;
    8. const int mod=1e9+7;
    9. struct edge{int v,w,next;}e[N<<1];int tot,head[N];
    10. int n,m,dis[N],cnt[N],sum[N],ans[N*5],q[N*20];bool vis[N*5];
    11.  
    12. void add(int x,int y,int z){
    13. e[++tot].v=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
    14. }
    15. void dijkstra(int S){
    16. memset(dis,inf,(n+1)<<2);
    17. memset(vis,0,(n+1)<<2);
    18. memset(cnt,0,(n+1)<<2);cnt[S]=1;
    19. priority_queue<pir,vector<pir>,greater<pir> >q;
    20. q.push(make_pair(dis[S]=0,S));
    21. while(!q.empty()){
    22. pir t=q.top();q.pop();
    23. int x=t.second;
    24. if(vis[x]) continue;
    25. vis[x]=1;
    26. for(int i=head[x];i;i=e[i].next){
    27. if(!vis[e[i].v]&&dis[e[i].v]>dis[x]+e[i].w){
    28. dis[e[i].v]=dis[x]+e[i].w;
    29. cnt[e[i].v]=cnt[x];
    30. q.push(make_pair(dis[e[i].v],e[i].v));
    31. }
    32. else if(dis[e[i].v]==dis[x]+e[i].w){
    33. cnt[e[i].v]+=cnt[x];
    34. cnt[e[i].v]%=mod;
    35. }
    36. }
    37. }
    38. }
    39. int dfs(int x){
    40. if(sum[x]) return sum[x];
    41. sum[x]=1;
    42. for(int i=head[x];i;i=e[i].next){
    43. if(dis[e[i].v]!=dis[x]+e[i].w) continue;
    44. sum[x]+=dfs(e[i].v);
    45. ans[i]+=sum[e[i].v]*cnt[x];
    46. ans[i]%=mod;
    47. }
    48. return sum[x];
    49. }
    50. void init(){
    51. scanf("%d%d",&n,&m);
    52. for(int i=1,x,y,z;i<=m;i++){
    53. scanf("%d%d%d",&x,&y,&z);
    54. add(x,y,z);
    55. }
    56. }
    57. void work(){
    58. for(int i=1;i<=n;i++){
    59. memset(sum,0,(n+1)<<2);
    60. dijkstra(i);
    61. dfs(i);
    62. }
    63. for(int i=1;i<=m;i++) printf("%d ",ans[i]);
    64. }
    65. int main(){
    66. freopen("roadsw.in","r",stdin);
    67. freopen("roadsw.out","w",stdout);
    68. init();
    69. work();
    70. return 0;
    71. }
  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/shenben/p/6541010.html
Copyright © 2011-2022 走看看