#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 long ll hd[MAXN],to[MAXM<<],cnt;
ll nxt[MAXM<<],cst[MAXM<<];
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=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
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,,sizeof(dis));
priority_queue<node> q;
q.push((node){s,});
ans[]=;dis[s]=;
while(!q.empty()){
node tp=q.top();q.pop();
if(vis[tp.u]) continue;
vis[tp.u]=;
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]=,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=;
for(ll i=;i<=M;i++){
ll u=read(),v=read(),w=read();
addedge(u,v,w);
}
Dijkstra();
for(ll i=;i<=N;i++) num*=ans[i]%mod,num%=mod;
printf("%lld\n",num%mod);
return ;
}

【loj10064】黑暗城堡的更多相关文章

  1. LOJ10064黑暗城堡

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

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

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

  3. [LOJ#10064]黑暗城堡

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

  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. loj黑暗城堡

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

  8. T57274 黑暗城堡

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

  9. CH6202 黑暗城堡

    一道最短路+生成树 原题链接 实际上就是生成树的中每个点到节点\(1\)的距离等于原图中这个点到节点\(1\)的最短距离,求这样的生成树的棵数. 先用\(SPFA\)或\(Dijkstra\)求出所有 ...

随机推荐

  1. spring cloud - 注册中心

    服务注册与发现 这里我们会用到Spring Cloud Netflix,该项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用 ...

  2. Linux - Unix环境高级编程(第三版) 源代码编译(即头文件apue.h如何使用问题)【转】

    本文转载自:http://blog.csdn.net/hadas_wang/article/details/43203795 1. 下载代码:http://www.apuebook.com/code3 ...

  3. AutoItLibrary安装和常见问题解决

    http://blog.csdn.net/bible_reader/article/details/52044345

  4. hdu-5742 It's All In The Mind(数学)

    题目链接: It's All In The Mind Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (J ...

  5. adb 读写模式 挂载文件系统

    删除需要把system挂载为读写,用到了这篇文章的这个命令: shell@android:/ # mount -o rw,remount yassf2 /system/   完整文章转自:http:/ ...

  6. Intellij IDEA 弹窗License activation 报 this license BIG3CLIK6F has been cancelled 错误的解决。

    this license BIG3CLIK6F has been cancelled 具体如下: 对,没错,这个激活码本来可以使用到2018年的,但是,忽然间就不能用了.经查询吧. 还得修改个系统配置 ...

  7. gsoap开发webservice

    gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多.绝大多数的C++web服务工具包提供一组API函数类库来处 ...

  8. bzoj 3527 [Zjoi2014] 力 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 看了看TJ才推出来式子,还是不够熟练啊: TJ:https://blog.csdn.n ...

  9. IOS造成卡顿的主要原因

    1. cellForRowAtIndexPath, 单元格视图重用, 注意尽量让所有视图重用, 只根据单元格row和section的不容更换不同的数据, 而不是每次都生成新的单元格, 这是程序奔溃的前 ...

  10. ubuntu下安装显卡驱动

    前言           以下内容是个人学习之后的感悟,转载请注明出处~ 作者的显卡是GT 730,现以NVIDIA-Linux-x86-384.69为例. 1.打开终端,先删除旧的驱动: sudo ...