黑暗城堡-(最小生成树+最短路)
咕咕咕
prim的特点是从一个点开始,不断把距离最短的点加入图中,在以此延伸。是一种贪心的想法。当知道prim的特点的时候,就可以想到这题用prim。
这题又要求实际路径=最短路径,,也可以想到用dijkstra。
具体做法:
用dijkstra求出1号犯贱到每个房间的单元最短路。把树形城堡看做以1为根的有根树。
把所有节点按照dis值排序,从小到大一次考虑吧每个节点p加入树形城堡有多少种方法。
和prim类似,维护“最短路径生成树”的一部分记为T
统计有多少个节点x满足,x∈T并且dis[ p ] = dis [ x ] + edge ( x , p ),其中edge表示边的长度。
让p与其中任意一个x项链都符合题目的要求。
根据乘法原理,把每一步统计出的数据乘起来,即可得答案。
#include<cstdio> #include<algorithm> #include<queue> #include<cstring> #define mk make_pair #define ll long long using namespace std; inline int read() {int sum = 0,p = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')p = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){(sum *= 10) += ch - '0';ch = getchar();} return sum * p; }const int M = 5e5 + 10; const int N = 1e3 + 5; const int mod = 2147483647; int n,m; int head[N],cnt; struct edge {int nxt,to,wei; }e[M<<1]; priority_queue<pair<int,int> > q; bool vis[N]; int dis[N],sum[N]; struct pot {int id,dis; }p[N];void add(int x,int y,int v)//加边 {e[++cnt].nxt = head[x];e[cnt].to = y;e[cnt].wei = v;head[x] = cnt; }void dijkstra() {memset(dis,0x3f,sizeof(dis));dis[1] = 0;q.push(mk(0,1));while(q.size()){int u = q.top().second;q.pop();if(vis[u])continue;vis[u] =true;for(int i = head[u];i;i = e[i].nxt){int v = e[i].to;if(dis[u] + e[i].wei < dis[v]){dis[v] = dis[u] +e[i].wei;q.push(mk(-dis[v],v));}} } }bool cmp(pot a,pot b) {return a.dis < b.dis; }int main() {n = read(),m = read();for(int i = 1;i <= m;i++){int x = read(),y = read(),l = read();add(x,y,l);add(y,x,l); } dijkstra();// for(int i = 1;i <= n;i++) // printf("%d-===-%d\n",i,dis[i]); // puts("\n");for(int i = 1;i <= n;i++){p[i].id = i;p[i].dis = dis[i];}sort(p+1,p+n+1,cmp);memset(vis,false,sizeof(vis));vis[1] = true;for(int i = 2;i <= n;i++){vis[p[i].id] = true;for(int j = head[p[i].id];j;j = e[j].nxt){int v = e[j].to;if(vis[v] && dis[v] + e[j].wei == p[i].dis)sum[i]++;}} // for(int i = 1;i <= n;i++) // printf("%d----%d\n",i,sum[i]); ll ans = 1;for(int i = 2;i <= n;i++)ans = (ans * sum[i])%mod;printf("%lld",ans);return 0; }
转载于:https://www.cnblogs.com/darlingroot/p/11278752.html
黑暗城堡-(最小生成树+最短路)相关推荐
- LOJ:黑暗城堡(最短路)
题目描述 求一个图关于1的最小路径树的方案数 解析 想复杂了qwq 跑dij的时候如果dis[now]+w==dis[to],就使cnt[to]++ 如果更新dis,cnt赋值成1 最后乘起来即可 本 ...
- 信息奥赛一本通1486: CH 6202 黑暗城堡 最短路径生成树计数
1486:黑暗城堡 [题目描述] 知道黑暗城堡有 N 个房间,M 条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设 Di为如果所有的通道都被修建,第 i 号房间与第 1 ...
- SPFA算法+例题 :问题 A: 黑暗城堡
SPFA算法 算法思想: 1) 三角形中的性质:同一三角形内两边之和大于第三边. 2)由上面那一条性质,我们可以想出一个方法来更新源点到其他点的最短的路径:用中间节点k松弛u->k->v, ...
- 一本通 P1486 【黑暗城堡】
题库 :一本通 题号 :1486 题目 :黑暗城堡 link :http://ybt.ssoier.cn:8088/problem_show.php?pid=1486 思路 :这道题既然要求使加入生成 ...
- 黑暗城堡 最短路径生成树
dark♂城堡(233 题目描述 一个图,有n个节点,m条带权值无向边,构造一颗生成树,使得树上的点到根(1)的距离为该点到1的最短距离.输出符合条件的生成树的个数 答案模取\(2^{31}-1\) ...
- acwing349 黑暗城堡 ——最短路径生成树
Link 思路 最短路径生成树计数 代码 // // #include <bits/stdc++.h> using namespace std; //#define mp make_pai ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 牛客刷题之图论-最小生成树
题目集链接 目录 1.黑暗城堡 2.北极通讯网络 3.新的开始 4.构造完全图 5.秘密的牛奶运输 6.Tree 7.最小生成树计数 8.次小生成树 1.黑暗城堡 先求出最小生成树的每个边权,然后枚举 ...
- 《算法进阶指南》最小生成树剩余题目
CH6201 走廊泼水节 CH6202 黑暗城堡 转载于:https://www.cnblogs.com/LLbinGG/p/9910965.html
最新文章
- C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】
- linux Address already in use 端口被占用解决办法
- AI 与区块链:两大热门技术,会碰撞出什么样的火花?
- 官方教育网代理地址MSN
- 李宏毅线性代数笔记4:向量
- 使用Lambda表达式重构委托
- VTK:可视化算法之DecimateHawaii
- MDK调试:设置断点处,代码运行的次数
- 送书|北大出版:R语言数据分析与可视化从入门到精通
- c语言指针代码大全,C语言之指针(示例代码)
- php 合并 js css,PHP实现合并多个JS和CSS文件示例
- 支付宝回调验签失败解决办法
- 嵌入式操作系统内核原理和开发(固定内存分配算法)
- 手把手教你详细分析 Chrome 1day 漏洞 (CVE-2021-21224)
- 【基础】CNN是靠什么线索学习到深度信息的?——一个经验性探索
- Python和C++交互
- win10 华硕ASUS USB AC56 无线网卡 欧版 5G 信号不全 问题修复
- 平均年薪23万!为什么却很少见程序员炫富?
- [python]打日语
- robosense激光雷达使用及适配autoware