黑暗城堡

题目描述

你知道黑暗城堡有\(N\)个房间,M 条可以制造的双向通道,以及每条通道的长度。

城堡是树形的并且满足下面的条件:

设\(D_i\)为如果所有的通道都被修建,第i号房间与第1号房间的最短路径长度;

而\(S_i\)为实际修建的树形城堡中第i号房间与第1号房间的路径长度;

要求对于所有整数\(i(1<= i <= N)\),有\(S_i = D_i\)成立。

你想知道有多少种不同的城堡修建方案。当然,你只需要输出答案对\(2 ^ {31} - 1\)取模之后的结果就行了。

输入格式

第一行为两个由空格隔开的整数 ;

第二行到第n + 1行为3个由空格隔开的整数x,y,l:表示x号房间与y号房间之间的通道长度为l。

输出格式

一个整数:不同的城堡修建方案数对\(2 ^ {31} - 1\)取模之后的结果。

题解:首先dij,求出1号点到其他点的最短距离。

然后扫描所有边,如果dis[v]==dis[u]+e[i].w,说明让v点的距离为给最短距离的路径又多了一条,所以,cnt[v]++;

最终结果就是所有点的cnt[]相乘。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <queue>
  4. #define orz cout << "AK IOI"
  5. using namespace std;
  6. const int maxn = 1010;
  7. const int maxm = 500010;
  8. const int mod = 2e31 - 1;
  9. inline int read()
  10. {
  11. int x = 0, f = 1;
  12. char ch = getchar();
  13. while (ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
  14. while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0';ch = getchar();}
  15. return x * f;
  16. }
  17. int n, m, dis[maxn], vis[maxn], cnt[maxn];
  18. long long ans = 1;
  19. struct edge{
  20. int u, v, w, nxt;
  21. }e[maxm << 1];
  22. int head[maxn], js;
  23. void add(int u, int v, int w)
  24. {
  25. e[++js].u = u;
  26. e[js].v = v;
  27. e[js].w = w;
  28. e[js].nxt = head[u];
  29. head[u] = js;
  30. }
  31. struct node{
  32. int w, now;
  33. bool operator < (const node &x)const
  34. {
  35. return w > x.w;
  36. }
  37. };
  38. priority_queue<node> q;
  39. void dijkstra(int s)
  40. {
  41. for(int i = 1; i <= n; i++)
  42. dis[i] = 0x7fffffff;
  43. dis[s] = 0;
  44. q.push((node{0, s}));
  45. while(!q.empty())
  46. {
  47. node t = q.top();
  48. q.pop();
  49. int u = t.now;
  50. if(vis[u]) continue;
  51. vis[u] = 1;
  52. for(int i = head[u]; i; i = e[i].nxt)
  53. {
  54. int v = e[i].v;
  55. if(dis[v] > dis[u] + e[i].w)
  56. {
  57. dis[v] = dis[u] + e[i].w;
  58. q.push((node{dis[v], v}));
  59. }
  60. }
  61. }
  62. }
  63. int main()
  64. {
  65. n = read(), m = read();
  66. for(int i = 1; i <= m; i++)
  67. {
  68. int u = read(), v = read(), w = read();
  69. add(u, v, w);
  70. add(v, u, w);
  71. }
  72. dijkstra(1);
  73. /*for(int i = 1; i <= n; i++)
  74. printf("%d ",dis[i]);*/
  75. for(int i = 1; i <= n; i++)
  76. for(int j = head[i]; j; j = e[j].nxt)
  77. {
  78. int v = e[j].v;
  79. if(dis[v] == dis[i] + e[j].w)
  80. cnt[v]++;
  81. }
  82. for(int i = 2; i <= n; i++)
  83. ans = ans * cnt[i] % mod;
  84. printf("%lld",ans);
  85. return 0;
  86. }

loj黑暗城堡的更多相关文章

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

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

  2. [LOJ#10064]黑暗城堡

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

  3. 【loj10064】黑暗城堡

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

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

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

  5. 「CH6202」黑暗城堡

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

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

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

  7. LOJ10064黑暗城堡

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

  8. 【LOJ#10064】黑暗城堡

    题目大意:定义一个无向图的最短路径生成树如下:在该无向图的生成树中,任意一个节点到根节点的距离均等于根节点到该节点的最短路.求有多少种最短路径生成树. 题解:首先跑一遍 dij 求出从根节点到每个节点 ...

  9. T57274 黑暗城堡

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

随机推荐

  1. [leetcode]109. Convert Sorted List to Binary Search Tree链表构建二叉搜索树

    二叉树的各种遍历方式都是可以建立二叉树的,例如中序遍历,就是在第一步建立左子树,中间第二步建立新的节点,第三步构建右子树 此题利用二叉搜索树的中序遍历是递增序列的特点,而链表正好就是递增序列,从左子树 ...

  2. 【探索之路】机器人篇(1)-ROS-mwRobot开篇

    机器人的定义 首先,什么才是机器人?机器人是不是必须和人一样的外形?我们先看一看维基百科给机器人的定义: 由上可见,机器人并不是和人一样的外形,而是可以模拟人类行为或者思想再或者是模拟其他生物的机械. ...

  3. 1.第一个QT程序

    第一个QT程序 应用程序类QApplication 窗口类MyWidget 进入事件循环 a.exec() 头文件 mywidget.h QApplication 文件Demo_pro 我怎么知道我用 ...

  4. 破解版IDM使用问题

    正版的IDM一般下载安装后有30天的免费使用期,过了就需要买正版序列号才能使用,网上一般提供的破解版的IDM安装后又存在无法添加到chrome插件的问题 这里针对这个问题给出解决方案: 首先下载破解版 ...

  5. ThreadLocal源码深度剖析

    ThreadLocal源码深度剖析 ThreadLocal的作用 ThreadLocal的作用是提供线程内的局部变量,说白了,就是在各线程内部创建一个变量的副本,相比于使用各种锁机制访问变量,Thre ...

  6. 如何在 Linux 系统查询机器最近重启时间

    如何在 Linux 系统查询机器最近重启时间 在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到 ...

  7. CVE-2021-3019 漏洞细节纰漏

    CVE编号 CVE-2021-3019 lanproxy任意文件读取 该漏洞是2021年比较新的漏洞 是否需要认证:否 是否执行远程代码:否 是否执行远程命令:否 数据读取是否内网:否 漏洞软件介绍 ...

  8. java的多线程:java安全问题产生的原因与JMM的关系

    一.多线程产生安全问题 1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存 ...

  9. Lesson_strange_words6

    stylized 有艺术效果的 slide 幻灯片,滑动 template 模板,样板 grasp 掌握,领悟 factor 因素 twisted pair cable 双绞线 twisted 扭曲的 ...

  10. Study_way

    一.Study 学习通Java基础视频.语法 开源中国 (Git)版本控制 读懂程序.源代码 相关资源 百度网盘 程序:方法(数学) 二.参数传递 基本数据的传参:虚参改变影响实参 引用数据的传参:数 ...