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. }
  • 相关阅读:
    网络传输协议 UDP & TCP 详解
    OSI 七层协议
    (01day)python接口测试
    Python2和Python3的区别,以及为什么选Python3的原因
    JAVA反编译工具
    JAR反编译工具
    webdriver19-witchto方法
    webdriver实例14-Xpath定位的几种方法
    webdirver实例1--查找元素
    Qt插件开发
  • 原文地址:https://www.cnblogs.com/shenben/p/6541010.html
Copyright © 2011-2022 走看看