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

内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统    评测方式:文本比较
上传者: 1bentong

提交    提交记录    统计    讨论    测试数据

题目描述

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

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

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

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

要求对于所有整数 i (1≤i≤N),有 Si=Di​​ 成立。

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

输入格式

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

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

输出格式

一个整数:不同的城堡修建方案数对 2^31 取模之后的结果。

样例

样例输入

4 6
1 2 1
1 3 2
1 4 3
2 3 1
2 4 2
3 4 1

样例输出

6

样例说明

一共有 4 个房间,6 条道路,其中 1 号和 2 号,1 号和 3 号,1 号和 4 号,2 号和 3 号,2 号和 4 号,3 号和 4 号房间之间的通道长度分别为 1,2,3,1,2,1。

而不同的城堡修建方案数对 2^31 取模之后的结果为 6。

数据范围与提示

对于全部数据,1≤N≤1000,1≤M≤N(N−1)/2,1≤l≤200。

题意:

求一个无向图中最短路径树的棵数。

最短路径树的定义:

选出$N-1$条边组成一棵树,对于给定的源点$S$,

若任何点$u$均满足在原图上$S$到点$u$的最短路$dis(u)$等于在这棵树上$S$到$u$的最短路$disnew(u)$,

则这棵树是一棵最短路径树。

我的直观感受:答案应该等于$S$到每个点的最短路条数的乘积吧?

然后写了。错了。发现输入写错了。

(千万不要把连边读入写成$add(read(),read(),read())$,这玩意好像是反着读进来的)

改了输入,$A$了。

……

考虑生成一棵最短路径树的方法,只需要在$dis(v)>dis(u)+e(u,v)$(即发生更新)时记录$fa(v)=u$,

最后按父子关系把树连起来即可。由于每个点都有且仅有一个$fa$,可以证明这一定是一棵树。

我们发现,若出现一个$v$使得$dis(v)=dis(u)+e(u,v)$,$fa(v)$便有两种选择,任取一种均合法。

推广开来,当出现$N$个$dis(v)=dis(u)+e(u,v)$时,$fa(v)$便有$N+1$种选择,任取一种均合法。

(由于$dis(v)=dis(u)+e(u,v)$这样的状态不会影响最短路算法的运行,所以$fa(v)$取何值都不会对其他点产生影响)

既然每个点互不影响,我们就可以直接运用乘法原理把每个$v$的选择数乘起来得到答案。

显然$v$的选择数就是$S\rightarrow v$的最短路的条数,打板即可。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>using namespace std;
#define MAXN 100005
#define MAXM 1000005
#define mod 0x7fffffff
#define ll long longll hd[MAXN],to[MAXM<<1],cnt;
ll nxt[MAXM<<1],cst[MAXM<<1];
struct node{ll u,w;bool operator<(const node b)const{return w>b.w;}
};
ll dis[MAXN],ans[MAXN];
bool vis[MAXN];
inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=x*10+c-'0';return x*f;
}inline void addedge(ll u,ll v,ll w){to[++cnt]=v,cst[cnt]=w,nxt[cnt]=hd[u],hd[u]=cnt;to[++cnt]=u,cst[cnt]=w,nxt[cnt]=hd[v],hd[v]=cnt;return;
}inline void Dijkstra(ll s){memset(dis,127,sizeof(dis));priority_queue<node> q;q.push((node){s,0}); ans[1]=1;dis[s]=0;while(!q.empty()){node tp=q.top();q.pop();if(vis[tp.u]) continue;vis[tp.u]=1;for(ll i=hd[tp.u];i;i=nxt[i]){ll v=to[i],w=cst[i];if(dis[v]>tp.w+w){ans[v]=1,dis[v]=tp.w+w;q.push((node){v,dis[v]});}else if(dis[v]==tp.w+w) ans[v]++;}}return;
}int main(){ll N=read(),M=read(),num=1;for(ll i=1;i<=M;i++){ll u=read(),v=read(),w=read();addedge(u,v,w);}Dijkstra(1);for(ll i=1;i<=N;i++) num*=ans[i]%mod,num%=mod;printf("%lld\n",num%mod);return 0;
}

转载于:https://www.cnblogs.com/YSFAC/p/9851837.html

【loj10064】黑暗城堡相关推荐

  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. LOJ:黑暗城堡(最短路)

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

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

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

  8. 《算法进阶指南》最小生成树剩余题目

    CH6201 走廊泼水节 CH6202 黑暗城堡 转载于:https://www.cnblogs.com/LLbinGG/p/9910965.html

  9. sol - 0x60,61,62

    [例题]走廊泼水节 设当前扫描到边x,y,长度为z,x所处的并查集为Sx,y所处的并查集为Sy: 对于任意u属于Sx,v属于Sy,我们可以知道u,v之间必连一条边 但是我们要在保证x,y之间的边属于唯 ...

  10. 万圣节海报素材PSD分层模板

    对其他人来说,万圣节可能意味着装饰和化妆派对,但对设计师来说,万圣节是一年中创作令 人毛骨悚然的艺术品的时候,给你的客户的网站提供恐怖的主题等等. 尽管如此,他们需要用新鲜的万圣节资源来填充他们的设计 ...

最新文章

  1. linux下c语言写文件,Linux下C语言之文件操作
  2. LFFD ncnn torch
  3. 设置Tomcat字符编码UTF-8
  4. [CQOI2009]叶子的染色
  5. 陈玉林是哪里人_玉林仿古砖公司在哪里
  6. PHP设计模式练习——制作简单的投诉页面
  7. 【kafka】在 Kafka Streams 中启用 Exactly-Once
  8. 【BZOJ】2553: [BeiJing2011]禁忌 AC自动机+期望+矩阵快速幂
  9. java 抽奖_简单实现java抽奖系统
  10. 微信公众号开发功能大全
  11. zool网关多个组件配置路由
  12. 定时任务实现原理详解
  13. 20180108 自省
  14. IDEA跳至行首行末快捷键
  15. java 玻璃效果_JavaFX中的磨砂玻璃效果?
  16. u盘文件看得见却打不开_U盘插入电脑能看到盘符但打不开怎么办
  17. 雅思作文——阶段总结和思考
  18. 温控器PID调节记录及注意事项
  19. C# 文本输入限制类型,datagridview单元格输入验证
  20. 《城市交通大数据》读书总结

热门文章

  1. 用简单的图来解释人工神经网络(三)——BP神经网络
  2. 罗胖关于管理与企业发展的关系
  3. 工欲善其事,必先利其器 — “CSDN浏览器插件” 办公必备“神器” | 你值得拥有
  4. python条形图的间距_如何减少堆积条形图中条形图之间的间距?
  5. RabbitMQ An unexpected connection driver error occured错误
  6. 【面试题】计算机网络 -- 常见面试题总结
  7. 百度人脸识别之人脸注册AddUser
  8. 10 个深恶痛绝的 Java 异常
  9. 无法启用家庭计算机共享,无法启用共享访问,详细教您无法启用共享访问怎么解决...
  10. tt作曲家简谱打谱软件_每个人的本地作曲家! 会议友好的满意设置