题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624
代码
#include<iostream>#include<cstdio>#include<string>#include<map>using namespace std;const int maxn = 2100;const int INF = 1000000000;//初始化参数map<int, string> intToString;// 终于明白为什么要使用int映射了,因为数组的索引用string不太方便map<string, int> stringToInt;map<string, int> Gang;int G[maxn][maxn] = {0}, weight[maxn] = {0};int n, k, numPerson = 0;bool vis[maxn] = {false};void DFS(int nowVisit, int& head, int& numMember, int& totalValue){numMember++;//人数加一vis[nowVisit] = true;//标记已经访问if(weight[nowVisit] > weight[head]) head = nowVisit;//更新头领for(int i = 0; i < numPerson; i++){if(G[nowVisit][i] > 0){totalValue += G[nowVisit][i];G[nowVisit][i] = G[i][nowVisit] = 0;//删除这条边if(vis[i] == false) DFS(i, head, numMember, totalValue);}}}void DFSTrave(){for(int i = 0; i < numPerson; i++){if(vis[i] == false){//如果还没被访问int head = i, numMember = 0, totalValue = 0;//置初始值DFS(i, head, numMember, totalValue);if(numMember > 2 && totalValue > k){//如果成员大于两个,且权值大于k,那么就是头目Gang[intToString[head]] = numMember;}}}}int change(string str){if(stringToInt.find(str) != stringToInt.end()){return stringToInt[str];//如果找到那么就返回数字,否则} else {stringToInt[str] = numPerson;//新建一对映射关系intToString[numPerson] = str;return numPerson++;}}int main(){int w;string str1, str2;cin>> n >> k;for(int i = 0; i < n; i++){cin >> str1 >> str2 >> w;int id1 = change(str1);int id2 = change(str2);weight[id1] += w;weight[id2] += w;G[id1][id2] += w;//联系是相互的,因此是累加的G[id2][id1] += w;}DFSTrave();cout << Gang.size() << endl;for(auto it = Gang.begin(); it != Gang.end(); it++){cout << it->first <<" " <<it->second << endl;}return 0;}
