鱼C论坛

 找回密码
 立即注册
查看: 2318|回复: 0

[技术交流] PTA A_1034 Head of a Gang

[复制链接]
发表于 2020-2-18 09:55:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 798236606 于 2020-2-18 09:59 编辑

传送门:https://pintia.cn/problem-sets/9 ... /994805456881434624

解:
图的DFS +求边和
  1. #include <iostream>
  2. #include <string>
  3. #include <map>

  4. using namespace std;

  5. const int maxn = 2010;

  6. int G[maxn][maxn], k, num, m, total, max_id;
  7. int weight[maxn];
  8. bool vis[maxn];
  9. map<string, int> s2i, gang;
  10. map<int, string> i2s;

  11. int add_name(string s)
  12. {
  13.     int id = s2i[s];

  14.     if (!id)
  15.     {
  16.         s2i[s] = ++num;
  17.         i2s[num] = s;
  18.         return num;
  19.     }

  20.     return id;
  21. }

  22. void DFS(int id)
  23. {
  24.     if (!vis[id]) m++;//计算同伙人数
  25.     if (weight[id] > weight[max_id]) max_id = id;//查找头目

  26.     vis[id] = true;
  27.     // cout << i2s[id] << weight[id] << endl;
  28.     for (int i = 1; i <= num; i++)
  29.         if (G[id][i])
  30.         {
  31.             // cout << i2s[id] << "--" << i2s[i] << "=" << G[id][i] << endl;
  32.             total += G[id][i];//一个团伙的总通话时间
  33.             G[id][i] = G[i][id] = 0;//切断已经计算过的边
  34.             DFS(i);
  35.         }
  36. }

  37. int DFS_traverse(void)
  38. {
  39.     int n = 0;

  40.     for (int i = 1; i <= num; i++)
  41.     {
  42.         if (!vis[i])
  43.         {
  44.             m = total = 0;
  45.             max_id = i;

  46.             DFS(i);

  47.             if (m > 2 && total > k && ++n) gang[i2s[max_id]] = m;
  48.             // cout << "max_id = " << i2s[max_id] << "total = " << total << "n = " << n << endl;
  49.         }
  50.     }

  51.     return n;
  52. }

  53. int main() {
  54.     // freopen("input.txt", "r", stdin);
  55.     int n;

  56.     cin >> n >> k;

  57.     while (n--)
  58.     {
  59.         string s1, s2;
  60.         int w;

  61.         cin >> s1 >> s2 >> w;
  62.         
  63.         int n1 = add_name(s1);
  64.         int n2 = add_name(s2);
  65.         weight[n1] += w;
  66.         weight[n2] += w;
  67.         G[n1][n2] += w;
  68.         G[n2][n1] += w;
  69.     }

  70.     printf("%d\n", DFS_traverse());

  71.     for (map<string, int>::iterator it = gang.begin(); it != gang.end(); ++it)
  72.         cout << it->first << " " << it->second << endl;

  73.     return 0;
  74. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表