【问题描述】

给定一张?个点?条边的无向连通图,每条边有边权。我们需要从?条边中
选出? − 1条, 构成一棵树。 记原图中从 1 号点到每个节点的最短路径长度为? ? ,
树中从 1 号点到每个节点的最短路径长度为? ? ,构出的树应当满足对于任意节点
?,都有? ? = ? ? 。

请你求出选出? − 1条边的方案数。

【输入格式】

输入的第一行包含两个整数?和?。
接下来?行,每行包含三个整数?、?和?,描述一条连接节点?和?且边权为
?的边。

【输出格式】

输出一行,包含一个整数,代表方案数对2 31 − 1取模得到的结果。

【样例输入】

3 3
1 2 2
1 3 1
2 3 1

【样例输出】

2

【数据规模和约定】

32 ≤ ? ≤ 5,? ≤ 10。
对于50%的数据,满足条件的方案数不超过 10000。
对于100%的数据,2≤ ? ≤ 1000,? − 1 ≤ ? ≤
? ?−1
2
,1 ≤ ? ≤ 100。

思路:

  按照题目里的说的模拟

  先跑一遍spfa得出单源最短路

  然后对于每一个点枚举所有与它相连的点

  如果与它相连的点的dis值加上这条边的权值等于它的dis值

  则这个点的价值加一

  所有的点枚举完后

  把价值为0的点赋值为1

  然后所有点的价值相乘

  即可得出答案

  但是

  你以为这就是正解?

  别忘了取mod(因为这个我没了40分)

  有mod才是正解

来,上代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5.  
  6. using namespace std;
  7.  
  8. struct node {
  9. int from,to,dis,next;
  10. };
  11. struct node edge[];
  12.  
  13. const long long int mod=;
  14.  
  15. int num_head,num_edge,num_1=,head[];
  16. int dis_1[],tree_leaf[],num_leaf=;
  17.  
  18. long long int ans_edge=;
  19. long long int num_edge_tree[];
  20.  
  21. char word;
  22.  
  23. bool if_in_tree[];
  24.  
  25. queue<int>q;
  26.  
  27. inline void edge_add(int from,int to,int dis)
  28. {
  29. num_1++;
  30. edge[num_1].to=to;
  31. edge[num_1].dis=dis;
  32. edge[num_1].from=from;
  33. edge[num_1].next=head[from];
  34. head[from]=num_1;
  35. }
  36.  
  37. inline void read_int(int &now_001)
  38. {
  39. now_001=;word=getchar();
  40. while(word>''||word<'') word=getchar();
  41. while(word>=''&&word<='')
  42. {
  43. now_001=now_001*+(int)(word-'');
  44. word=getchar();
  45. }
  46. }
  47.  
  48. void map_spfa()
  49. {
  50. bool if_in_spfa[];
  51. memset(dis_1,/,sizeof(dis_1));
  52. memset(if_in_spfa,false,sizeof(if_in_spfa));
  53. dis_1[]=;
  54. if_in_spfa[]=true;
  55. q.push();
  56. int cur_1,cur_2;
  57. while(!q.empty())
  58. {
  59. cur_1=q.front();
  60. for(int i=head[cur_1];i!=;i=edge[i].next)
  61. {
  62. if(dis_1[cur_1]+edge[i].dis<dis_1[edge[i].to])
  63. {
  64. dis_1[edge[i].to]=dis_1[cur_1]+edge[i].dis;
  65. if(!if_in_spfa[edge[i].to])
  66. {
  67. q.push(edge[i].to);
  68. if_in_spfa[edge[i].to]=true;
  69. }
  70. }
  71. }
  72. if_in_spfa[cur_1]=false;
  73. q.pop();
  74. }
  75. }
  76.  
  77. int main()
  78. {
  79. read_int(num_head),read_int(num_edge);
  80. int from,to,dis;
  81. for(int i= ; i<=num_edge ; i++)
  82. {
  83. read_int(from),read_int(to),read_int(dis);
  84. edge_add(from,to,dis);
  85. edge_add(to,from,dis);
  86. }
  87. map_spfa();
  88. for(int j=;j<=num_head;j++)
  89. {
  90. for(int i=head[j];i!=;i=edge[i].next)
  91. {
  92. if(edge[i].dis+dis_1[j]==dis_1[edge[i].to])
  93. {
  94. num_edge_tree[edge[i].to]++;
  95. num_edge_tree[edge[i].to]%=mod;
  96. }
  97. }
  98. }
  99. for(int i=;i<=num_head;i++) if(num_edge_tree[i]==) num_edge_tree[i]=;
  100. for(int i=;i<=num_head;i++)
  101. {
  102. ans_edge*=num_edge_tree[i];
  103. ans_edge%=mod;
  104. }
  105. cout<<ans_edge<<endl;
  106. return ;
  107. }

城堡 (spfa+cheng)的更多相关文章

  1. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  2. ZOJ1232 Adventure of Super Mario spfa上的dp

    很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...

  3. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  4. 一本通 P1486 【黑暗城堡】

    题库 :一本通 题号 :1486 题目 :黑暗城堡 link :http://ybt.ssoier.cn:8088/problem_show.php?pid=1486 思路 :这道题既然要求使加入生成 ...

  5. 信息奥赛一本通1486: CH 6202 黑暗城堡 最短路径生成树计数

    1486:黑暗城堡 [题目描述] 知道黑暗城堡有 N 个房间,M 条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设 Di为如果所有的通道都被修建,第 i 号房间与第 1 ...

  6. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  7. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  8. sgu 240 Runaway (spfa)

    题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...

  9. spfa模板

    通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...

随机推荐

  1. linux下log4j乱码解决

    使用log4j的时候,在WIN系统的时候正常显示中文,但是发布到linux系统的时候中文就显示成乱码了 由于log4j配置文件中没有设置编码格式(encoding),所以log4j就使用系统默认编码. ...

  2. 帝吧出征FB:这李毅吧的“爆吧”文化是如何形成的

    声明:本文不对爆吧行为及其涉及的事件进行是非判断,只探讨帝吧文化本身,欢迎拍砖.更正和补充. 一.“帝吧FB出征”事件梳理 继上次全网集体骂 “薯片”事件后,昨日(1月20日)晚7点,又发生了一次互联 ...

  3. 自己写的表格插件autotable

    自己写的表格插件autotable 作者:田想兵,个人网址:http://www.lovewebgames.com 这个表格插件所完成的功能是:ajax请求数据,然后动态绑定到指定表格下,格式化,分页 ...

  4. C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

    C#中要如何才能删除一个字符串数组中的空字符串呢?随着微软对C#不断发展和更新,C#中对于数组操作的方式也变得越来越多样化.以往要实现过滤数组中的空字符串,都是需要实行循环的方式来排除和过滤.C#3. ...

  5. ArcEngine 0x8004023C

    在进行缓冲区查询时,查询的并是不要素本身的范围,而是缓冲一定半径,所以用到了ITopologicalOperator接口,主要是利用其buffer方法,代码如下: IFeatureClass pFea ...

  6. Java解析XML三种常用方法

    1.使用DOM方式解析: package com.wzh.dom; import java.util.Iterator; import javax.xml.parsers.DocumentBuilde ...

  7. 在Android开发中使用Ant 二:进行一次完整的打包

    一次完整的Android打包要进行以下的几步:编译.代码混淆.打包apk.签名apk.apk优化. 为了能包涵使用NDK的情况,在这里使用一个有native代码的工程TestJni. 在工程根目录下新 ...

  8. [Weblogic]startWebLogic.cmd配置JAVA_OPTIONS无效的解决思路与方案

    事情背景: 由于某个项目原因,需要在2个域的startWebLogic.cmd文件加入如下设置 set JAVA_OPTIONS=%JAVA_OPTIONS% -javaagent:"pat ...

  9. Spring-2-H Array Diversity(SPOJ AMR11H)解题报告及测试数据

    Array Diversity Time Limit:404MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Descript ...

  10. Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图

    现在的web项目,图片越来越多,图片大小也越来越大,随便就能达到1M,2M,甚至更大.用户上传的图片,一般是无法直接使用的.一般要生成两三种对应的缩略图,分别适配不同的终端,不同的场景.比如PC,手机 ...