题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624

明天再写一遍。。完了再写心得感受

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<map>
  5. using namespace std;
  6. const int maxn = 2100;
  7. const int INF = 1000000000;
  8. //初始化参数
  9. map<int, string> intToString;// 终于明白为什么要使用int映射了,因为数组的索引用string不太方便
  10. map<string, int> stringToInt;
  11. map<string, int> Gang;
  12. int G[maxn][maxn] = {0}, weight[maxn] = {0};
  13. int n, k, numPerson = 0;
  14. bool vis[maxn] = {false};
  15. void DFS(int nowVisit, int& head, int& numMember, int& totalValue){
  16. numMember++;//人数加一
  17. vis[nowVisit] = true;//标记已经访问
  18. if(weight[nowVisit] > weight[head]) head = nowVisit;//更新头领
  19. for(int i = 0; i < numPerson; i++){
  20. if(G[nowVisit][i] > 0){
  21. totalValue += G[nowVisit][i];
  22. G[nowVisit][i] = G[i][nowVisit] = 0;//删除这条边
  23. if(vis[i] == false) DFS(i, head, numMember, totalValue);
  24. }
  25. }
  26. }
  27. void DFSTrave(){
  28. for(int i = 0; i < numPerson; i++){
  29. if(vis[i] == false){//如果还没被访问
  30. int head = i, numMember = 0, totalValue = 0;//置初始值
  31. DFS(i, head, numMember, totalValue);
  32. if(numMember > 2 && totalValue > k){//如果成员大于两个,且权值大于k,那么就是头目
  33. Gang[intToString[head]] = numMember;
  34. }
  35. }
  36. }
  37. }
  38. int change(string str){
  39. if(stringToInt.find(str) != stringToInt.end()){
  40. return stringToInt[str];//如果找到那么就返回数字,否则
  41. } else {
  42. stringToInt[str] = numPerson;//新建一对映射关系
  43. intToString[numPerson] = str;
  44. return numPerson++;
  45. }
  46. }
  47. int main(){
  48. int w;
  49. string str1, str2;
  50. cin>> n >> k;
  51. for(int i = 0; i < n; i++){
  52. cin >> str1 >> str2 >> w;
  53. int id1 = change(str1);
  54. int id2 = change(str2);
  55. weight[id1] += w;
  56. weight[id2] += w;
  57. G[id1][id2] += w;//联系是相互的,因此是累加的
  58. G[id2][id1] += w;
  59. }
  60. DFSTrave();
  61. cout << Gang.size() << endl;
  62. for(auto it = Gang.begin(); it != Gang.end(); it++){
  63. cout << it->first <<" " <<it->second << endl;
  64. }
  65. return 0;
  66. }