#2012. 诈骗电话检测

诈骗电话检测

题目描述

电信诈骗是社会毒瘤。请你编写程序,实现一个较为简单的算法,从一天内的大量通话记录中自动筛查出诈骗团伙嫌疑人。

共有 nn 个电话号码,编号为 1n1 \sim n。给出这一天的 mm 条通话记录,每条记录包含:

  • 呼出者 uu
  • 接收者 vv
  • 本次通话时长 dd(单位:分钟)

对于任意两个不同的电话号码 u,vu,v(即 uvu \ne v),定义:

  • 若这一天内从 uu 呼出到 vv 的所有通话记录的总时长不超过 55 分钟,则称 vvuu 的一个短通话对象
  • 若这一天内存在至少一条从 vv 呼出到 uu 的通话记录,则称 vv uu 回过电话

如果某个通话者 uu 满足:

  1. uu 的短通话对象个数严格大于 kk
  2. 在这些短通话对象中,给 uu 回过电话的人数不超过其短通话对象总数的 2020%

则判定 uu诈骗嫌疑人

进一步地,在所有诈骗嫌疑人之间建立一个无向图。若两个诈骗嫌疑人 x,yx,y 满足:

  • 至少存在一条从 xxyy 的通话记录;
  • 且至少存在一条从 yyxx 的通话记录;

则在 x,yx,y 之间连一条无向边。该无向图的每一个连通块中的所有嫌疑人构成一个诈骗团伙。

请你找出所有疑似诈骗团伙。


输入格式

从标准输入按以下格式读取数据:

kk nn mm

u1u_1 v1v_1 d1d_1

u2u_2 v2v_2 d2d_2

\vdots

umu_m vmv_m dmd_m

其中:

  • 第一行输入三个整数 k,n,mk,n,m
  • 接下来 mm 行,每行输入三个整数 u,v,du,v,d,表示一条通话记录:呼出者为 uu,接收者为 vv,本次通话时长为 dd 分钟。

输出格式

如果存在疑似诈骗团伙,则每行输出一个团伙中所有成员的编号,要求:

  • 同一行内按从小到大输出;
  • 若有多个团伙,则按每个团伙中最小编号从小到大输出;
  • 行内相邻两个数字之间用一个空格分隔,行首行末不得有多余空格。

如果不存在任何诈骗嫌疑人,则输出一行:

None

数据范围

  • 1k5001 \le k \le 500
  • 1n1031 \le n \le 10^3
  • 1m1051 \le m \le 10^5
  • 1u,vn1 \le u,v \le n
  • 0d14400 \le d \le 1440

说明

为避免歧义,特别说明如下:

  1. “给不同的人拨出超过 kk 个短通话”中的“不同的人”指不同的电话号码,因此 uu 不应把自己计入统计对象中。
  2. 对于同一对有向号码 (u,v)(u,v),一天内可能有多条通话记录。判断 vv 是否为 uu 的短通话对象时,应先把所有 uvu \to v 的通话时长累加,再判断其总时长是否不超过 55
  3. “给他回电话”只要求存在至少一条 vuv \to u 的通话记录,对回拨通话的时长没有要求。
  4. 条件“回拨人数不超过短通话对象总数的 2020%”可等价理解为:5×回拨人数短通话对象总数5 \times \text{回拨人数} \le \text{短通话对象总数}
  5. “两个嫌疑人之间互相有通话”指两个方向的通话记录都至少出现过一次。
  6. 诈骗团伙按嫌疑人互通关系构成的无向图的连通块来定义,而不是仅按两两直接互通来定义。

样例

5 15 31
1 4 2
1 5 2
1 5 4
1 7 5
1 8 3
1 9 1
1 6 5
1 15 2
1 15 5
3 2 2
3 5 15
3 13 1
3 12 1
3 14 1
3 10 2
3 11 5
5 2 1
5 3 10
5 1 1
5 7 2
5 6 1
5 13 4
5 15 1
11 10 5
12 14 1
6 1 1
6 9 2
6 10 5
6 11 2
6 12 1
6 13 1
3 5
6
5 7 8
1 2 1
1 3 1
1 4 1
1 5 1
1 6 1
1 7 1
2 1 1
3 1 1
None