题意:成员A与成员B通话 ,成员B与成员C通话,则 ABC即为一个团伙,一共有若干个团伙,每个团伙的人数大于2且相互通话时间超过一定值即为黑帮,每个黑帮伙里有一个BOSS,boss是与各个成员打电话最多的那一个,找出所有黑帮boss跟与之相应成员数,按字典序排列。

分析:通话姓名是字符串,不好直接构图,离散化一下,在用并查集确定团伙,在查找黑帮与BOSS

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<stack>
  5. #include<map>
  6. #include<string>
  7. using namespace std;
  8.  
  9. int bossLen[];
  10. int oneLen[];
  11. int Link[];
  12. int n,K;
  13. map<string,int>mm1; // 字符串对应数字
  14. map<int,string>mm2;//数字对应字符串
  15. int f[];
  16. int point[];
  17. int index=;
  18.  
  19. struct data{
  20. string name;
  21. int linkN;
  22. }node[];
  23. int headNum=;
  24.  
  25. int find(int n){
  26. if(f[n]==-)return n;
  27. return f[n]=find(f[n]);
  28. }
  29.  
  30. int um(int a,int b){
  31. int fa=find(a),fb=find(b);
  32. if(fa==fb)return ;
  33. else f[fa]=fb;
  34. }
  35.  
  36. void init(){
  37. int i;
  38. for(i=;i<=;i++){
  39. bossLen[i]=;
  40. oneLen[i]=;
  41. }
  42. for(i=;i<=;i++){
  43. f[i]=-;
  44. }
  45.  
  46. string str1,str2;
  47. for(i=;i<=n;i++){
  48. cin>>str1;
  49. int ll,rr;
  50. if(mm1.find(str1)==mm1.end()){
  51. index++;
  52. mm1[str1]=index;
  53. mm2[index]=str1;
  54. ll=index;
  55. }else{
  56. ll=mm1[str1];
  57. }
  58. cin>>str2;
  59. if(mm1.find(str2)==mm1.end()){
  60. index++;
  61. mm1[str2]=index;
  62. mm2[index]=str2;
  63. rr=index;
  64. }else{
  65. rr=mm1[str2];
  66. }
  67. int temp;
  68. scanf("%d",&temp);
  69. bossLen[ll]+=temp;
  70. bossLen[rr]+=temp;
  71. oneLen[ll]+=temp;
  72. um(ll,rr);
  73. }
  74. }
  75.  
  76. int cmp(data x,data y){
  77. return x.name<y.name;
  78. }
  79.  
  80. void cal(){
  81. int i;
  82.  
  83. int useground[];
  84. int hash1[];
  85. int groundLen[];
  86. int hashLen[];
  87. for(i=;i<=index;i++){
  88. useground[i]=;
  89. Link[i]=;
  90. point[i]=find(i);
  91. hash1[i]=;
  92. hashLen[i]=;
  93. }
  94. for(i=;i<=index;i++){
  95. hash1[point[i]]++;
  96. }
  97.  
  98. for(i=;i<=index;i++){
  99. hashLen[point[i]]+=oneLen[i];
  100. Link[i]=hash1[point[i]];
  101. }
  102.  
  103. for(i=;i<=index;i++){
  104. groundLen[i]=hashLen[point[i]];
  105. if(Link[i]>&&groundLen[i]>K){
  106. if(useground[point[i]]==)continue;//该团伙遍历过,就不要遍历了
  107. headNum++;
  108.  
  109. int rk,max=,k;
  110. for(k=;k<=index;k++){//找团队中单人最多通话,就是老大
  111. if(point[i]!=point[k])continue;
  112. if(bossLen[k]>max){
  113. max=bossLen[k];
  114. rk=k;
  115. }
  116. }
  117. useground[point[rk]]=;
  118. node[headNum].linkN=Link[rk];
  119. node[headNum].name=mm2[rk];
  120. }
  121. }
  122. printf("%d\n",headNum);
  123. sort(&node[],&node[headNum+],cmp);
  124. for(i=;i<=headNum;i++){
  125. cout<<node[i].name<<" "<<node[i].linkN<<endl;
  126. }
  127.  
  128. }
  129.  
  130. int main()
  131. {
  132. while(scanf("%d%d",&n,&K)!=EOF){
  133. int i;
  134. init();
  135. cal();
  136. }
  137.  
  138. return ;
  139. }

PAT1034. Head of a Gang ——离散化+并查集的更多相关文章

  1. BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 689  Solved: 296 [Submit][Sta ...

  2. PAT甲题题解-1034. Head of a Gang (30)-并查集

    给出n和k接下来n行,每行给出a,b,c,表示a和b之间的关系度,表明他们属于同一个帮派一个帮派由>2个人组成,且总关系度必须大于k.帮派的头目为帮派里关系度最高的人.(注意,这里关系度是看帮派 ...

  3. AcWing:237. 程序自动分析(离散化 + 并查集)

    在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xjxi=x ...

  4. POJ 2513 Colored Sticks (离散化+并查集+欧拉通路)

    下面两个写得很清楚了,就不在赘述. http://blog.sina.com.cn/s/blog_5cd4cccf0100apd1.htmlhttp://www.cnblogs.com/lyy2890 ...

  5. 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...

  6. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  7. [BZOJ1370][Baltic2003]Gang团伙 并查集+拆点

    Description 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个 ...

  8. acdream 1725 哗啦啦的小彭玉染色问题 离散化并查集

    哗啦啦的小彭玉染色问题 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1725 Descri ...

  9. 【bzoj1370】[Baltic2003]Gang团伙 并查集

    题目描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信息, ...

随机推荐

  1. ansible 调用playbook api执行(一)

    一 调用ansible playbook api执行playbook 1 准备好hosts文件 root@ansible:~/ansible/playbooks# cat hosts [all:var ...

  2. eclipse安装插件:

    eclipse安装插件:jre跟eclipse的bit数必须匹配,即必须都是32or64位的 历史版本不好找,pydev的历史版本在sourceforge中很隐蔽,得在项目的activite中查找,另 ...

  3. ParentNodes、childNodes、children之间的区别

    "parentNode" 常用来获取某个元素的父节点. 把 parentNodes 理解为容器, 在容器中有个子节点 例: <div id="parent" ...

  4. C/C++文件指针偏移

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. linux系统挂载NTFS移动硬盘

    有时候做大数据量迁移时,为了快速迁移大数据,有可能在Linux服务器上临时挂载NTFS格式的移动硬盘, 一般情况下,Linux是识别不了NTFS格式移动硬盘的(需要重编译Linux核心才能,加挂NTF ...

  6. tooltip提示框组件

    Tooltip 提示框组件 可独立于其他组件通过$.fn.tooltip.defaults重写默认的defaults.当用户移动鼠标指针在某个元素上时,出现提示信息窗口来显示额外信息.提示内容可以包含 ...

  7. 在Vim中使用gtags

    之前一直使用vim+ctags+cscope来弄c的代码,最近看同事使用gtags,觉得在搜索方面要高级很多,网上大多都是emacs+gtags的资料,而vim的则比较少,这里搞通了之后,做个记录. ...

  8. python爬虫入门(3)-环境搭建

    下载集成包 链接:http://pan.baidu.com/s/1pKD2zBP 密码:f75b 这里采用python2.7.9   安装步骤:1.安装python2.7(默认安装即可) 2.打开“运 ...

  9. learn go recursive

    package main // 参考文章: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.6.md im ...

  10. 隐居网V2.0

    经过一个月加班加点的努力,我们终于把隐居网V2.0版做好了(一个设计两个前端三个程序).上一版的隐居网因为经验不够底层架构没搭好(前台和后台都是),又是赶工期,导致后面越做越坑爹.所谓从哪里跌倒从哪里 ...