[LOJ#10064]黑暗城堡
Description
在顺利攻破 Lord lsp 的防线之后,lqr 一行人来到了 Lord lsp 的城堡下方。Lord lsp 黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商水平却没怎么增加。现在 lqr 已经搞清楚黑暗城堡有 N 个房间,M 条可以制造的双向通道,以及每条通道的长度。lqr 深知 Lord lsp 的想法,为了避免每次都要琢磨两个房间之间的最短路径, Lord lsp一定会把城堡修建成树形的;但是,为了尽量提高自己的移动效率,Lord lsp 一定会使得城堡满足下面的条件:设 Di为如果所有的通道都被修建,第 i 号房间与第 1 号房间的最短路径长度;而 Si 为实际修建的树形城堡中第 i 号房间与第1 号房间的路径长度,对于所有满足 1≤i≤N 的整数 i,有 Si = Di。为了打败 Lord lsp,lqr想知道有多少种不同的城堡修建方案。于是 lqr 向 applepi 提出了这个问题。由于 applepi 还要忙着出模拟赛,所以这个任务就交给你了。当然,你只需要输出答案对 2^31 – 1 取模之后的结果就行了.
Input
第一行有两个整数 N 和 M。
之后 M 行,每行三个整数 X,Y 和 L,表示可以修建 X 和 Y 之间的一条长度为 L 的通道。
2≤N≤1000,N – 1≤M≤N(N – 1)/2,1≤L≤100
Output
输出一个整数,表示答案对 2^31 – 1 取模之后的结果。
Sample Input
3 3
1 2 2
1 3 1
2 3 1
Sample Output
2
首先求出单源最短路,然后考虑第i个点,我们可以枚举1~i-1个点,求出dis[j]+g[i][j]=dis[i]的点,然后使用乘法原理即可。由于第i个点不可能由那些dis比它大的点转移过来,因此我们要开始按dis排序
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){int x=0,f=1;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';return x*f;
}
inline void print(int x){if (x>=10) print(x/10);putchar(x%10+'0');
}
const int N=1e3,M=1e6,MOD=0x7fffffff;
struct S1{#define ls (p<<1)#define rs (p<<1|1)#define fa (p>>1)struct node{int x,v;bool operator <(const node &a)const{return v<a.v;}}Q[N*50+10];int tot;void insert(int x,int v){Q[++tot]=(node){x,v};int p=tot;while (p!=1&&Q[p]<Q[fa]) swap(Q[p],Q[fa]),p=fa;}void Delete(){Q[1]=Q[tot--];int p=1,son;while (ls<=tot){if (rs>tot||Q[ls]<Q[rs]) son=ls;else son=rs;if (Q[son]<Q[p]) swap(Q[p],Q[son]),p=son;else break;}}
}Heap;
int pre[(M<<1)+10],now[N+10],child[(M<<1)+10],val[(M<<1)+10],tot;
int g[N+10][N+10],dis[N+10],ID[N+10];
bool vis[N+10];
void join(int x,int y,int z){pre[++tot]=now[x],now[x]=tot,child[tot]=y,val[tot]=z;}
void insert(int x,int y,int z){join(x,y,z),join(y,x,z);}
bool cmp(const int &x,const int &y){return dis[x]<dis[y];}
void Dijkstra(int x){memset(dis,63,sizeof(dis));Heap.insert(x,dis[x]=0);while (Heap.tot){int Now=Heap.Q[1].x;Heap.Delete();if (vis[Now]) continue;vis[Now]=1;for (int p=now[Now],son=child[p];p;p=pre[p],son=child[p]){if (dis[son]>dis[Now]+val[p]){dis[son]=dis[Now]+val[p];Heap.insert(son,dis[son]);}}}
}
int main(){int n=read(),m=read(),Ans=1;memset(g,63,sizeof(g));for (int i=1;i<=m;i++){int x=read(),y=read(),z=read();insert(x,y,z);g[y][x]=g[x][y]=min(g[x][y],z);}for (int i=1;i<=n;i++) g[i][i]=0,ID[i]=i;Dijkstra(1);sort(ID+1,ID+1+n,cmp);for (int i=2;i<=n;i++){int res=0;for (int j=1;j<i;j++)if (dis[ID[j]]+g[ID[i]][ID[j]]==dis[ID[i]])res++;Ans=1ll*Ans*res%MOD;}printf("%d\n",Ans);return 0;
}
转载于:https://www.cnblogs.com/Wolfycz/p/9745781.html
[LOJ#10064]黑暗城堡相关推荐
- 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\) ...
- 黑暗城堡-(最小生成树+最短路)
咕咕咕 prim的特点是从一个点开始,不断把距离最短的点加入图中,在以此延伸.是一种贪心的想法.当知道prim的特点的时候,就可以想到这题用prim. 这题又要求实际路径=最短路径,,也可以想到用di ...
- acwing349 黑暗城堡 ——最短路径生成树
Link 思路 最短路径生成树计数 代码 // // #include <bits/stdc++.h> using namespace std; //#define mp make_pai ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 《信息学奥赛一本通》提高版题单
第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...
- 《算法进阶指南》最小生成树剩余题目
CH6201 走廊泼水节 CH6202 黑暗城堡 转载于:https://www.cnblogs.com/LLbinGG/p/9910965.html
最新文章
- php bdecode,PHP base64_encode和base64_decode 编码/解码url
- 【学习笔记】Python 基础零碎知识
- mysql 学习笔记13 查询语句强化
- 前端学习(3173):react-hello-react之todoList教程
- Android学习问题:关于AlertDialog中自定义布局带有的EditText无法弹出键盘
- 高考英语口试计算机系,高考英语口试材料.docx
- java双引号的转义字符_好程序员Java教程分享常见的转义字符
- matlab三次样条拟合,【MATLAB编程】三次样条
- github的账号SSH设置
- 餐饮业进销存软件哪个好用?推荐这十款
- 工作也能用 Tinder 配对?一家叫 Palaround 的公司就在做这门生意
- Android航海航线地图,Alfa的航海大时代航线介绍 全航线跑商路线详解
- [人脸算法]技术方向综述
- 如何将逻辑地址转换成物理地址
- 微服务高性能高可用架构设计
- 记录百度地图使用中遇到的问题
- 领导者-追随者模型介绍
- c语言中未定义标识符IDD,一、Windows对话框—对话框及其模板
- 智慧消防压力表可实现远程监控
- 15款免费又好用的安全软件
热门文章
- artDialog对话框组件使用方法
- Text strings must be rendered within a Text component的一个情况
- UE4学习之VR(三)
- python对数正态分布函数_将对数正态分布的拟合PDF缩放到python中的histrogram
- 一张纸的厚度为0.08mm,对折多少次能达到或超过珠穆朗玛峰的高度(8848.13米)
- PayPal 今天 Reopen?
- 【CH01】创建、初始化SpringBoot项目与项目git管理
- 51单片机之系统指令
- 云栖社区2017中国开发者调查报告
- android 智能手环应用,戴图智能手环app(健康手环应用) 1.7.8安卓版