题目大意:定义一个无向图的最短路径生成树如下:在该无向图的生成树中,任意一个节点到根节点的距离均等于根节点到该节点的最短路。求有多少种最短路径生成树。

题解:首先跑一遍 dij 求出从根节点到每个节点的最短路,再跑 prim,模拟该生成树生成的过程,即:维护最短路径生成树集合,对于每个新加入生成树集合的点,对与其相邻的且不在生成树中的点进行判断,若满足 \(d[u]+e[i].to==d[v]\) 则 v 的可能情况加一。最后利用乘法原理统计答案即可。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> P;
  4. const int maxv=1010;
  5. const int maxe=1e6+10;
  6. const int mod=(1LL<<31)-1;
  7. inline int read(){
  8. int x=0,f=1;char ch;
  9. do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
  10. do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
  11. return f*x;
  12. }
  13. struct node{
  14. int nxt,to,w;
  15. }e[maxe];
  16. int tot=1,head[maxv];
  17. inline void add_edge(int from,int to,int w){
  18. e[++tot]=node{head[from],to,w},head[from]=tot;
  19. }
  20. int n,m,d[maxv],stk[maxv],top,cnt[maxv];
  21. long long ans=1;
  22. bool vis[maxv];
  23. priority_queue<P> q;
  24. void read_and_parse(){
  25. n=read(),m=read();
  26. for(int i=1,x,y,z;i<=m;i++){
  27. x=read(),y=read(),z=read();
  28. add_edge(x,y,z),add_edge(y,x,z);
  29. }
  30. }
  31. void dij(){
  32. memset(d,0x3f,sizeof(d));
  33. d[1]=0,q.push(make_pair(0,1));
  34. while(q.size()){
  35. int u=q.top().second;q.pop();
  36. if(vis[u])continue;
  37. vis[u]=1,stk[++top]=u;
  38. for(int i=head[u];i;i=e[i].nxt){
  39. int v=e[i].to,w=e[i].w;
  40. if(d[v]>d[u]+w){
  41. d[v]=d[u]+w;
  42. q.push(make_pair(-d[v],v));
  43. }
  44. }
  45. }
  46. }
  47. void prim(){
  48. memset(vis,0,sizeof(vis));
  49. cnt[1]=1;
  50. for(int i=1;i<=n;i++){
  51. int u=stk[i];
  52. vis[u]=1;
  53. for(int j=head[u];j;j=e[j].nxt){
  54. int v=e[j].to;if(vis[v])continue;
  55. if(d[v]==d[u]+e[j].w)++cnt[v];
  56. }
  57. }
  58. for(int i=1;i<=n;i++)ans=ans*cnt[i]%mod;
  59. }
  60. void solve(){
  61. dij();
  62. prim();
  63. printf("%lld\n",ans);
  64. }
  65. int main(){
  66. read_and_parse();
  67. solve();
  68. return 0;
  69. }

【LOJ#10064】黑暗城堡的更多相关文章

  1. [LOJ#10064]黑暗城堡

    Description 在顺利攻破 Lord lsp 的防线之后,lqr 一行人来到了 Lord lsp 的城堡下方.Lord lsp 黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商 ...

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

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

  3. loj黑暗城堡

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

  4. 【loj10064】黑暗城堡

    #10064. 「一本通 3.1 例 1」黑暗城堡 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统    评测方式:文本比较 上传者: 1bentong 提交     ...

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

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

  6. 「CH6202」黑暗城堡

    「CH6202」黑暗城堡 传送门 这道题是要让我们求以点 \(1\) 为源点的最短路树的方案数. 我们先跑一遍最短路,然后考虑类似 \(\text{Prim}\) 的过程. 当我们把点 \(x\) 加 ...

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

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

  8. LOJ10064黑暗城堡

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

  9. T57274 黑暗城堡

    传送门 思路: 先求出各个点到 1 的最短路径.分别用两个数组将最短路径记录下来(一个要用来排序).按排序后的 dis 值从小到大枚举各点加入树有多少种方案,最后根据乘法原理把各个点的方案数乘起来就是 ...

随机推荐

  1. Spring-data-jpa 学习笔记(二)

            通过上一篇笔记的,我们掌握了SpringData的相关概念及简单的用法.但上一篇笔记主要讲的是Dao层接口直接继承Repository接口,然后再自己定义方法.主要阐述了自定义方法时的 ...

  2. [Deep-Learning-with-Python] Keras高级概念

    Keras API 目前为止,介绍的神经网络模型都是通过Sequential模型来实现的.Sequential模型假设神经网络模型只有一个输入一个输出,而且模型的网络层是线性堆叠在一起的. 这是一个经 ...

  3. Security6:查看授予的权限

    在SQL Server的安全体系中,权限分为服务器级别(Server-Level)和数据库级别(Database-Level),用户的权限分为两种形式,分别是直接授予的权限,以及由于加入角色而获得的权 ...

  4. 异步编程之asyncio简单介绍

    引言: python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板. as ...

  5. 《Linux内核设计与实现》第一二章读书笔记

    第一章 Linux内核简介 1.Unix简介 (一)概念:支持抢占式多任务.多进程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统. (二)Unix特点(层次化结构): Unix很简洁,仅 ...

  6. 2017-2018 第一学期201623班《程序设计与数据结构》-第9&10周作业问题总结

    一.作业内容 第8周作业 http://www.cnblogs.com/rocedu/p/7484252.html#WEEK08 第9周作业 http://www.cnblogs.com/rocedu ...

  7. javascript 数组对象及其方法

    数组声明:通过let arr = new Array(); 或者 let arr = []; 数组对象可调用的方法: 1)find方法,使用情况是对数组进行筛选遍历,find方法要求某个函数(A)作为 ...

  8. Java的起源和发展

    程序设计语言的发展             第一代语言:机器语言   0011 1100 ……             第二代语言:汇编语言   ADD 12,0x13              第三 ...

  9. Spring scope注解

    Spring注解中@scope默认为单例模式(singleton) 设置写法@scope("") 1.singleton单例模式 全局有且仅有一个实例 2.prototype原型模 ...

  10. 第二个spring冲刺第8天

    今天我们团队分别安排了不同的任务,分别是1人程序编写,1人检查bug,1人负责客户体验,还有我们的总负责人王俊凯同学负责各个部分的协调.今天程序有了新的调整,但是功能还是没有完全做出来,不过还在开发途 ...