luogu#P7500. 「HMOI R1」地铁客流

「HMOI R1」地铁客流

题目背景

一座城市的地铁客流量是非常重要的指标,它体现了这座城市正在不断流动着的人口数量。无论通勤还是旅游,都会给这座城市的经济带来活力。

疫情期间各地地铁客流惨淡,甚至有部分城市地铁停运。现在疫情态势好转,各地陆续复工复产,地铁客流量大小也是判断城市复工复产、经济恢复率的重要参考。

题目描述

天穹市的地铁系统由 MM 条线路组成,共有 NN 座车站,每座车站都会有线路停靠。每条线路的相邻两站之间可视为由无向边连接。其中地铁 ii 号线上有 kik_i 座车站,这些车站互不相同

这些线路会在一些车站相交,也就是说,一座车站可能有很多线路停靠。

现在,有 PP 位乘客分别想从 sjs_j 号车站出发,去 tjt_j 号车站,保证这两座车站不同。当这两座车站不在一条线路上时,他就会进行若干次换乘。作为天穹地铁的技术工作人员,你需要计算这些乘客贡献的客流量。


请注意,在这里使用的客流量计算方法和实际应用中的有所不同。

客流量 == 进站客流 ++ 换乘客流。进站客流即为乘客数;换乘客流为乘客的换乘次数。起终点之间可能会有多条路径可以选择,此时,地铁客流量与 乘客选择的 路径无关;计算时,我们只考虑 换乘次数最少 的路径。


注意:

  • 设从 sstt 最少进行 trans\rm trans 次换乘,则此时要乘坐 trans+1\rm trans + 1 条线路,贡献 trans+1\rm trans + 1 的客流量。
  • 当乘客不能从起点到达终点时,即 s,ts, t 之间没有通路,他就会去坐公交,此时客流量计为 00

输入格式

第一行三个整数 N,M,PN, M, P

接下来 MM 行,每行表示一条地铁线路:
每行第一个整数为 ki (2kiN)k_i\ (2 \le k_i \le N),为这条线的车站数;
后面 kik_i 个整数 q (1qN)q\ (1 \le q \le N),为这条线路依次经过的车站编号。

接下来 PP 行,每行两个整数 sj,tj (1sj,tjN; sjtj)s_j, t_j\ (1 \le s_j, t_j \le N;\ s_j \neq t_j),表示一位乘客的出行起终点。

输出格式

仅一行一个整数,表示这些乘客贡献的客流量。

8 4 4
4 1 2 3 5
2 3 6
2 2 4
3 7 4 8
1 6
4 3
4 8
6 7
9
8 4 4
4 1 2 3 5
3 6 3 8
2 2 4
3 7 4 8
1 6
4 3
4 8
6 7
7
8 3 4
4 1 2 3 5
2 3 6
3 7 4 8
1 6
4 3
4 8
6 7
3

提示

样例解释:

  • 默认乘客会选择换乘次数最少的路径。
  • 边上的数字表示所在地铁线路的编号。

样例 1 如图:

乘客 11 会乘坐 11 号线从 1133,再乘坐 22 号线从 3366
乘客 22 会乘坐 33 号线从 4422,再乘坐 11 号线从 2233
乘客 33 会乘坐 44 号线从 4488
乘客 44 会乘坐 22 号线从 6633,乘坐 11 号线从 3322,再乘坐 33 号线从 2244,最后乘坐 44 号线从 4477

如上,四个人分别贡献了 2,2,1,42, 2, 1, 4 的客流量,答案为 99

样例 2 如图:

相比样例 1,
乘客 22 可以选择另外一条路线,即乘坐 44 号线从 4488,再乘坐 22 号线从 8833,也是换乘一次的;
乘客 44 可以选择另外一条换乘次数更少的的路线:乘坐 44 号线从 7788,再乘坐 22 号线从 8866,只换乘了一次。

总客流量为 2+2+1+2=72 + 2 + 1 + 2 = 7

样例 3 如图:

相比样例 1,乘客 2244 的出行路径不是通路,不会计入客流量。

总客流量为 2+0+1+0=32 + 0 + 1 + 0 = 3


设车站 ii 停靠的线路数为 sizi\mathrm{siz}_i
对于所有数据:

  • 2N1052 \le N \le 10^5
  • 1M10001 \le M \le 1000
  • 1P1001 \le P \le 100
  • 1sizi501 \le \mathrm{siz}_i \le 50

本题采用捆绑测试。

No. Constraints Score
11 N,P5; M3N, P \le 5;\ M \le 3 1010
22 ki=2k_i = 2 2020
33 N,M50; P10N, M \le 50;\ P \le 10
44 M500; P10M \le 500;\ P \le 10
55 No further constraints 3030

由于读入量较大,请勿不关流同步使用 cin

你可以通过 std::ios::sync_with_stdio(false) 来关闭 cin 的流同步。

你也可以使用以下快速读入模板,支持读入 int 范围内的非负整数。

int readInt() {
	int ret = 0; char o;
	while (!isdigit(o = getchar()));
	do ret = ret * 10 + (o ^ 48);
	while (isdigit(o = getchar()));
	return ret;
}

  • Idea: 南桥汽车站
  • Solution: 南桥汽车站
  • Code: 南桥汽车站
  • Data: 南桥汽车站