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]黑暗城堡相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  9. 《信息学奥赛一本通》提高版题单

    第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...

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

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

最新文章

  1. php bdecode,PHP base64_encode和base64_decode 编码/解码url
  2. 【学习笔记】Python 基础零碎知识
  3. mysql 学习笔记13 查询语句强化
  4. 前端学习(3173):react-hello-react之todoList教程
  5. Android学习问题:关于AlertDialog中自定义布局带有的EditText无法弹出键盘
  6. 高考英语口试计算机系,高考英语口试材料.docx
  7. java双引号的转义字符_好程序员Java教程分享常见的转义字符
  8. matlab三次样条拟合,【MATLAB编程】三次样条
  9. github的账号SSH设置
  10. 餐饮业进销存软件哪个好用?推荐这十款
  11. 工作也能用 Tinder 配对?一家叫 Palaround 的公司就在做这门生意
  12. Android航海航线地图,Alfa的航海大时代航线介绍 全航线跑商路线详解
  13. [人脸算法]技术方向综述
  14. 如何将逻辑地址转换成物理地址
  15. 微服务高性能高可用架构设计
  16. 记录百度地图使用中遇到的问题
  17. 领导者-追随者模型介绍
  18. c语言中未定义标识符IDD,一、Windows对话框—对话框及其模板
  19. 智慧消防压力表可实现远程监控
  20. 15款免费又好用的安全软件

热门文章

  1. artDialog对话框组件使用方法
  2. Text strings must be rendered within a Text component的一个情况
  3. UE4学习之VR(三)
  4. python对数正态分布函数_将对数正态分布的拟合PDF缩放到python中的histrogram
  5. 一张纸的厚度为0.08mm,对折多少次能达到或超过珠穆朗玛峰的高度(8848.13米)
  6. PayPal 今天 Reopen?
  7. 【CH01】创建、初始化SpringBoot项目与项目git管理
  8. 51单片机之系统指令
  9. 云栖社区2017中国开发者调查报告
  10. android 智能手环应用,戴图智能手环app(健康手环应用) 1.7.8安卓版