一、题目分析
1. 翻译
gang:黑帮,犯罪团伙
threshold:门槛
2. 分析
1)题意:A和B之间有通话,即A和B有联系;A和B之间联系的权值为A和B通话时间的总和;Gang是指一个集群,集群中超过两个人,且每两个人互相之间的通话时间之和要超过给出的门槛值K;在每个Gang中拥有最大权值的结点即为head;每个结点的权值是它所连接的边的权值之和。给出结点总数 通话关系数N和门槛值K,以及N个通话关系,要求找出存在几个Gang,分别输出它们的head和集群中成员的总人数。
2)N是关系总数,而不是结点总数,故设置结点数最大值MAXV须大于2000,以防段错误。
3)1️⃣每个人的名称及其序号之间的映射用map实现,map在我理解中可以视作一个“数组”,元素是一对一对出现的。2️⃣map mp表示typename1 到typename2 的映射,mp[typename1]=typename2,注意是[],而不是()。3️⃣mp.end()指向最后一对元素的下一对元素的位置,即为空,所以可以用此判断mp中是否有某一对元素。
4️⃣mp.find(typename1)返回的是一个迭代器类型,可以理解成指向的一个指针。5️⃣map::iterator it设置出一个迭代器,可以使用it->first和it->second分别访问元素typename1和typename2。
4)使用深度优先搜索,切记模板。
5)此题构成的图为有向图,但是边权可以按照无向图处理,例如A->B=10,B->A=20,则可以直接记A-B=30。那么,在计算完Gang中边权总和时,切记删去A->B和B->A两条路径。
6)Gang要满足两个条件:2人以上且边权总和大于K.
二、代码解析
#include
#include
#include
#include
#include
#include
#include