#zXSCSybttg030101. 1486:【例题1】黑暗城堡

1486:【例题1】黑暗城堡

好的,我将题目中的数字和名称用 ...... 标出。


题目描述

知道黑暗城堡有 NN 个房间,MM 条可以建造的双向通道,以及每条通道的长度。

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

  • DiD_i 为如果所有的通道都被修建(即全连通图),第 ii 号房间与第 11 号房间的最短路径长度。
  • SiS_i 为实际修建的树形城堡中第 ii 号房间与第 11 号房间的路径长度。
  • 要求对于所有整数 i(1iN)i(1 \le i \le N),有 Si=DiS_i = D_i 成立。

你想知道有多少种不同的城堡修建方案(不同的生成树方案数,并且满足 Si=DiS_i = D_i)。
输出答案对 23112^{31} - 1 取模之后的结果。


输入格式

第一行两个整数 N,MN,M
接下来 MM 行,每行三个整数 x,y,lx,y,l,表示 xx 号房间与 yy 号房间之间的通道长度为 ll

输出格式

一个整数,表示不同的城堡修建方案数对 23112^{31} - 1 取模之后的结果。


数据范围

  • 1N10001 \le N \le 1000
  • 1MN(N1)21 \le M \le \frac{N(N-1)}{2}
  • 1l2001 \le l \le 200

输入样例

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

输出样例

6

样例解释

44 个房间,66 条通道长度分别为:
(1,2):1(1,2):1, (1,3):2(1,3):2, (1,4):3(1,4):3, (2,3):1(2,3):1, (2,4):2(2,4):2, (3,4):1(3,4):1

先求所有通道都建时,从 11 到各点的最短路径 DiD_i(用 Dijkstra 或 Floyd):
D1=0D_1 = 0
D2=1D_2 = 1(直接 121 \to 2
D3=2D_3 = 2131 \to 3 直接 2,或 1231 \to 2 \to 3 也是 1+1=21+1=2
D4=2D_4 = 21241 \to 2 \to 41+2=31+2=3,但 1341 \to 3 \to 42+1=32+1=312341 \to 2 \to 3 \to 41+1+1=31+1+1=3,都不如 1241 \to 2 \to 4 更短?等一下,需要重新算)

用 Dijkstra 从 11 出发:

  • 22: 11
  • 33: 1+1=21+1=2(经 22)或直接 22
  • 44: 经 332+1=32+1=3,经 221+2=31+2=3,直接 33,所以 D4=3D_4 = 3

但题目样例说明中 D4=3D_4 = 3,但它是 33 吗?我们检查:
可能 12341 \to 2 \to 3 \to 41+1+1=31+1+1=3,确实最小是 33
所以 D=[0,1,2,3]D = [0, 1, 2, 3]

现在要求生成树满足从 11 到每个点的树上路径长度等于 DiD_i

那么对于每个点 ii(除 11 外),它的父节点必须满足 D[]+边权=D[i]D[父] + 边权 = D[i]

枚举所有点 ii,计算有多少个点 jj 满足 Dj+w(j,i)=DiD_j + w(j,i) = D_i,那么 ii 的父节点可以是这些 jj 中的任意一个,方案数乘起来。

计算:

  • i=2i=2D1+w(1,2)=0+1=1=D2D_1 + w(1,2)=0+1=1=D_2D3+w(3,2)=2+1=31D_3 + w(3,2)=2+1=3 \neq 1,只有 11 一个父节点候选,方案数 11
  • i=3i=3D1+w(1,3)=0+2=2=D3D_1 + w(1,3)=0+2=2=D_3D2+w(2,3)=1+1=2=D3D_2 + w(2,3)=1+1=2=D_3,有两个候选 1122,方案数 22
  • i=4i=4D1+w(1,4)=0+3=3=D4D_1 + w(1,4)=0+3=3=D_4D2+w(2,4)=1+2=3=D4D_2 + w(2,4)=1+2=3=D_4D3+w(3,4)=2+1=3=D4D_3 + w(3,4)=2+1=3=D_4,有三个候选 1,2,31,2,3,方案数 33

总方案数 =1×2×3=6= 1 \times 2 \times 3 = 6

输出 66


这样题目就完整了,所有数字和名称都用 ...... 标出。