• Godfather


    Godfather

     

    ‎去年,芝加哥到处都是黑帮大战和奇怪的谋杀案。警察局长对所有这些罪行感到非常厌倦,并决定逮捕黑手党领导人。‎

    ‎不幸的是,芝加哥黑手党的结构相当复杂。已知有‎‎n‎‎个人与黑手党有关。警方已经追踪了他们的活动一段时间,并知道他们中的一些人正在相互交流。根据收集到的数据,警察局长认为黑手党的等级制度可以表示为一棵树。黑手党的头目教父是树的根,如果某人由树中的节点表示,则其直接下属由该节点的子级表示。为了阴谋的目的,歹徒只与他们的直接下属和他们的直接主人沟通。‎

    ‎不幸的是,虽然警察知道歹徒的通讯,但他们不知道谁是任何一对通讯人员中的大师。因此,他们只有一棵无向的沟通树,不知道教父是谁。‎

    ‎基于教父希望对黑手党拥有最大可能控制权的想法,警察局长建议教父是这样的人,从通信树中删除后,剩余的最大连接组件的大小尽可能小。帮助警察找到所有潜在的教父,他们会逮捕他们。‎

    Input

    ‎输入文件的第一行包含‎‎n‎‎ - 涉嫌属于黑手党的人数(2≤‎‎n‎‎≤50 000)。让它们从1到‎‎n‎‎编号。‎

    ‎以下 ‎‎n‎‎ − 1 行各包含两个整数。对‎‎a‎‎i‎‎,‎‎b‎‎i‎‎表示歹徒‎‎a‎‎i‎‎与歹徒‎‎b‎‎i‎‎通信。可以保证歹徒的通信形成一棵树。‎

    Output

    ‎打印所有被怀疑是教父的人的号码。这些数字必须按递增的顺序打印,并用空格分隔。‎

    Sample

    InputcopyOutputcopy
    6
    1 2
    2 3
    2 5
    3 4
    3 6
    2 3

    1. #include
    2. #include
    3. using namespace std;
    4. inline void add(int x, int y);
    5. inline void dfs(int x, int fa);
    6. int n;
    7. struct edge
    8. {
    9. int nxt;
    10. int to;
    11. }ed[100010];
    12. int head[50010], cnt;
    13. inline void add(int x, int y)
    14. {
    15. ed[++cnt].nxt=head[x];
    16. ed[cnt].to= y;
    17. head[x]=cnt;
    18. }
    19. int siz[50010];
    20. int f[50010];
    21. int fat[50010];
    22. int mx=1e9;
    23. inline void dfs(int x, int fa)
    24. {
    25. siz[x] = 1;
    26. for (int i = head[x]; i; i = ed[i].nxt)
    27. {
    28. int to = ed[i].to;
    29. if (fa == to) continue;
    30. fat[to] = x;
    31. dfs(to, x);
    32. siz[x] += siz[to];
    33. }
    34. }
    35. int main()
    36. {
    37. scanf("%d", &n);
    38. for (int i = 1; i < n; i++)
    39. {
    40. int x, y;
    41. scanf("%d%d", &x, &y);
    42. add(x, y);
    43. add(y, x);
    44. }
    45. dfs(1, 0);
    46. for ( int x = 1; x <= n; x ++)
    47. {
    48. int sum=0;
    49. for (int i = head[x]; i; i = ed[i].nxt)
    50. {
    51. int to = ed[i].to;
    52. if (to == fat[x]) sum = max(sum, siz[1] - siz[x]);
    53. else sum = max(sum, siz[to]);
    54. }
    55. f[x] = sum;
    56. mx = min(mx, f[x]);
    57. }
    58. for ( int i = 1; i <= n; i ++)
    59. {
    60. if (f[i] == mx) printf("%d ", i);
    61. }
    62. return 0;
    63. }

  • 相关阅读:
    【LeetCode】No.104. Maximum Depth of Binary Tree -- Java Version
    漏洞概述-0day漏洞利用原理(0)
    女装品牌如何做线上产品推广?
    责任链模式(设计模式)
    【前端】JavaScript
    课堂练习P181最后一问:应回
    可变参数函数原理
    buu web部分wp
    大数据-消息队列:Pulsar
    MySQL索引
  • 原文地址:https://blog.csdn.net/weixin_62599885/article/details/126137442