AcWing 黑暗城堡

Description

  • 在顺利攻破Lord lsp的防线之后,lqr一行人来到了Lord lsp的城堡下方。

    Lord lsp黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商水平却没怎么增加。

    现在lqr已经搞清楚黑暗城堡有N个房间,M条可以制造的双向通道,以及每条通道的长度。

    lqr深知Lord lsp的想法,为了避免每次都要琢磨两个房间之间的最短路径,Lord lsp一定会把城堡修建成树形的。

    但是,为了尽量提高自己的移动效率,Lord lsp一定会使得城堡满足下面的条件:

    设 D[i] 为如果所有的通道都被修建,第 i 号房间与第1号房间的最短路径长度;而 S[i] 为实际修建的树形城堡中第 i 号房间与第1号房间的路径长度;要求对于所有整数 i,有 S[i]=D[i] 成立。

    为了打败Lord lsp,lqr想知道有多少种不同的城堡修建方案。

    你需要输出答案对 2 ^ 31–1

    取模之后的结果。

Input

  • 第一行有两个整数 N 和 M。

    之后 M 行,每行三个整数X,Y 和L,表示可以修建 X 和 Y 之间的一条长度为 L 的通道。

Output

  • 一个整数,表示答案对 2 ^ 31–1 取模之后的结果。

Sample Input

3 3
1 2 2
1 3 1
2 3 1

Sample Output

2

题解:

题解来自mzx

很显然题目要求的是一个图的生成树,这棵生成树要求满足根节点到每个结点的距离都等于原图中的最短距离

我们不妨将这样的树称之为这个图的最短路径生成树

首先生成树中的边肯定是最短路径子图中的边

​ 我来解释一下这个概念……

​ 首先图是由点集和边集两个元素组成的

​ 那么子图的点集和边集肯定是原图中的子集

​ 最短路径子图的点集肯定和原图一样

​ 顾名思义边集就是所有可能出现在最短路径中的边的集合

​ 即E'={e|dis[e.u]+e.l=dis[e.v]}

​ 我们可以用显然法证明,最短路径生成树一定是最短路径子图的生成树

​ 然鹅最短路径子图的生成树却并不一定是最短路径生成树_(:зゝ∠)_

​ 举个例子

​ V={1,2,3},E={(1,2,1),(2,3,1),(1,3,2)}(最后一个元素代表边的长度)

​ 显然这个图的每一条边都可能出现在最短路径中

​ 所以这个图的最短路径子图就是它本身

​ {(1,3,2)(2,3,1)}是这个图的最短路径子图的一个生成树

​ 然鹅并不是这个图的最短路径生成树,因为1到2的距离是3

有了以上的思路之后,我们可以先求出来最短路径子图

最短路径子图怎么求?

根据定义,跑一遍任何一个单源最短路算法(dij,SPFA),然后dis[i]+l[i][j]=dis[j]的边就是最短路径子图的边

然后我们将这些点按dis排序

假设我们现在已经求出了连通1...i-1这几个点的最短路径生成树个数

首先第i个点肯定是由1...i-1中的其中一个点连接的,而不可能是dis比i还大的那些点连接过来的。

然后1...i-1的生成树的形态和1...i-1中哪个点连接i这个点是没有关系的

也就是说这两个方案是相互独立的,计数中的互相独立意味着乘法原理的可行性

那么连通1...i的最短路径生成树个数就是1...i-1的生成树个数乘以1...i-1中任何一个点连接i这个点的最短路边的个数

讲完了

是不是很玄学……我也觉得,很想细讲但是发现没办法再讲了,自己脑补吧……

  • 我补充下自己的理解吧,根据题目要求,若x是y的父亲,x、y之间的道路长度为z。则有dis[y] = dis[x] + z。
  • 那么我们可以对于每个点,枚举它的出边,如果有上述的关系。说明可以从出边连的那个点向当前点连一条边(有可能可以有多个点与当前点有上述关系)。即一层一层的建树,每层有a种方法,建b层。是满足乘法原理的。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define N 1005
#define M 500005 * 2
#define int long long
#define hry ((1 << 31) - 1)
using namespace std;struct Node
{int val, pos;friend bool operator < (Node x, Node y) {return x.val > y.val;}
};
struct E {int next, to, dis;} e[M];
int n, m, num, ans = 1;
int h[N], dis[N], cnt[N];
bool vis[N];int read()
{int x = 0; char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}return x;
}void add(int u, int v, int w)
{e[++num].next = h[u];e[num].to = v;e[num].dis = w;h[u] = num;
}void dijkstra()
{memset(dis, 0x3f, sizeof(dis));priority_queue<Node> que;que.push((Node){0, 1}), dis[1] = 0;while(que.size()){int now = que.top().pos;que.pop();if(vis[now]) continue;vis[now] = 1;for(int i = h[now]; i != 0; i = e[i].next)if(dis[now] + e[i].dis < dis[e[i].to]){dis[e[i].to] = dis[now] + e[i].dis;que.push((Node){dis[e[i].to], e[i].to});}}
}signed main()
{cin >> n >> m;for(int i = 1; i <= m; i++){int u = read(), v = read(), w = read();add(u, v, w), add(v, u, w);}dijkstra();cnt[1] = 1;for(int i = 1; i <= n; i++)for(int j = h[i]; j != 0; j = e[j].next)if(dis[i] + e[j].dis == dis[e[j].to])cnt[e[j].to]++;for(int i = 1; i <= n; i++)ans = ((cnt[i] % hry) * ans) % hry;cout << ans;return 0;
}

转载于:https://www.cnblogs.com/BigYellowDog/p/11386388.html

AcWing 黑暗城堡相关推荐

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

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

  2. SPFA算法+例题 :问题 A: 黑暗城堡

    SPFA算法 算法思想: 1) 三角形中的性质:同一三角形内两边之和大于第三边. 2)由上面那一条性质,我们可以想出一个方法来更新源点到其他点的最短的路径:用中间节点k松弛u->k->v, ...

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

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

  4. 黑暗城堡 最短路径生成树

    dark♂城堡(233 题目描述 一个图,有n个节点,m条带权值无向边,构造一颗生成树,使得树上的点到根(1)的距离为该点到1的最短距离.输出符合条件的生成树的个数 答案模取\(2^{31}-1\) ...

  5. 黑暗城堡-(最小生成树+最短路)

    咕咕咕 prim的特点是从一个点开始,不断把距离最短的点加入图中,在以此延伸.是一种贪心的想法.当知道prim的特点的时候,就可以想到这题用prim. 这题又要求实际路径=最短路径,,也可以想到用di ...

  6. 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs

    题目分析 来源:acwing 分析:找房间个数,也就是找连通的个数. 样例画出来的房间个数如下图:其中'|' 和'-'不是墙,只有#是墙. 分析:这题不用建图,直接bfs(flood fill)来做, ...

  7. LOJ:黑暗城堡(最短路)

    题目描述 求一个图关于1的最小路径树的方案数 解析 想复杂了qwq 跑dij的时候如果dis[now]+w==dis[to],就使cnt[to]++ 如果更新dis,cnt赋值成1 最后乘起来即可 本 ...

  8. acwing349 黑暗城堡 ——最短路径生成树

    Link 思路 最短路径生成树计数 代码 // // #include <bits/stdc++.h> using namespace std; //#define mp make_pai ...

  9. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  10. AcWing算法提高课

    1. 动态规划(43/68) 1.1 数字三角形模型(4/4) 1.1.1 AcWing 1015. 摘花生 结论: f[i][j]=max⁡(f[i−1][j],f[i][j−1])+w[i][j] ...

最新文章

  1. the folder is already a source folder.
  2. 搞明白这八个问题,Linux系统就好学多了
  3. FI功能增强业务说明书
  4. CentOS中使用Docker+nginx部署Vue打包的dist项目
  5. canal介绍和使用docker安装canal
  6. Android Lint 去除重复资源 之 idea探究
  7. CentOS6.3中挂载NTFS移动硬盘的经历
  8. 【软件工程】构件化业务模型CBM
  9. Android--控件属性汇总
  10. codevs——1507 酒厂选址
  11. hadop 查看DataNode的资源使用情况信息(web接口)
  12. 性能测试之JMeter配置元件【HTTP信息头管理器】
  13. 欧姆龙cp1h指令讲解_欧姆龙cp1h常用指令学习(八)字符串处理指令
  14. 不用找,你想要的餐饮酒店word模板素材都在这里
  15. Java进制转换工具类
  16. 迅雷等待ftp服务器信息,如何去除迅雷的资源信息一栏
  17. 已解决SyntaxError: Non-UTF-8 code starting with ‘\xe8‘ in file
  18. 新媒体推广之今日头条
  19. 处理海量数据之awk命令
  20. 如何透过上层div点击下层的元素

热门文章

  1. beini奶瓶-无线网络蹭网破解-简明说明
  2. 2023北京眼镜展览会暨首届智能眼镜展览会
  3. java 替换 ppt内容_Java 替换PPT文档中的文本和图片
  4. linux openerp,Linux+OpenERP/ODOO 安装笔记求推荐。
  5. 如何查看网卡带宽是千兆还是百兆
  6. 中国开源走向第二梯队!
  7. winform高仿腾讯QQ2013,几十个界面哦!!
  8. vue click 跳转外部链接
  9. Junit5 单元测试框架的使用
  10. Aspose Word模板使用总结