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

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

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<map>
#include<string>
using namespace std; int bossLen[];
int oneLen[];
int Link[];
int n,K;
map<string,int>mm1; // 字符串对应数字
map<int,string>mm2;//数字对应字符串
int f[];
int point[];
int index=; struct data{
string name;
int linkN;
}node[];
int headNum=; int find(int n){
if(f[n]==-)return n;
return f[n]=find(f[n]);
} int um(int a,int b){
int fa=find(a),fb=find(b);
if(fa==fb)return ;
else f[fa]=fb;
} void init(){
int i;
for(i=;i<=;i++){
bossLen[i]=;
oneLen[i]=;
}
for(i=;i<=;i++){
f[i]=-;
} string str1,str2;
for(i=;i<=n;i++){
cin>>str1;
int ll,rr;
if(mm1.find(str1)==mm1.end()){
index++;
mm1[str1]=index;
mm2[index]=str1;
ll=index;
}else{
ll=mm1[str1];
}
cin>>str2;
if(mm1.find(str2)==mm1.end()){
index++;
mm1[str2]=index;
mm2[index]=str2;
rr=index;
}else{
rr=mm1[str2];
}
int temp;
scanf("%d",&temp);
bossLen[ll]+=temp;
bossLen[rr]+=temp;
oneLen[ll]+=temp;
um(ll,rr);
}
} int cmp(data x,data y){
return x.name<y.name;
} void cal(){
int i; int useground[];
int hash1[];
int groundLen[];
int hashLen[];
for(i=;i<=index;i++){
useground[i]=;
Link[i]=;
point[i]=find(i);
hash1[i]=;
hashLen[i]=;
}
for(i=;i<=index;i++){
hash1[point[i]]++;
} for(i=;i<=index;i++){
hashLen[point[i]]+=oneLen[i];
Link[i]=hash1[point[i]];
} for(i=;i<=index;i++){
groundLen[i]=hashLen[point[i]];
if(Link[i]>&&groundLen[i]>K){
if(useground[point[i]]==)continue;//该团伙遍历过,就不要遍历了
headNum++; int rk,max=,k;
for(k=;k<=index;k++){//找团队中单人最多通话,就是老大
if(point[i]!=point[k])continue;
if(bossLen[k]>max){
max=bossLen[k];
rk=k;
}
}
useground[point[rk]]=;
node[headNum].linkN=Link[rk];
node[headNum].name=mm2[rk];
}
}
printf("%d\n",headNum);
sort(&node[],&node[headNum+],cmp);
for(i=;i<=headNum;i++){
cout<<node[i].name<<" "<<node[i].linkN<<endl;
} } int main()
{
while(scanf("%d%d",&n,&K)!=EOF){
int i;
init();
cal();
} return ;
}

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. linux杀毒软件clamav安装与使用

    #clamav安装与使用 ###第一步:Clamav下载http://www.clamav.net/downloads wget http://www.clamav.net/downloads/pro ...

  2. RabbitMQ其他(八)

    1 RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer) 什么是ProtoBuf? 一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序 ...

  3. vue打包体积优化之旅

    webpack 与 vue 在使用vue开发时,遇到打包后单个文件太大,因而需要分包,不然加载时间太久.虽然尽可能减少请求次数,但是单个包太大也不是好事 思路 组件按需加载 vue-router 的懒 ...

  4. [转载]Java操作Excel文件的两种方案

    微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel.时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发.在我们实际开发企业办公系统的过程中,常常有客户这样子要 ...

  5. Qt:表格 tableWidget

    1.设置行数和列数 //设置行数 tableWidget->setRowCount(); //设置列数 tableWidget->setColumnCount(); 2.隐藏表头 tabl ...

  6. .Net使用Redis详解之ServiceStack.Redis(7)

    Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中 ...

  7. C# ASP.NET 验证码

    使用C# ASP.NET 获取 验证码的代码书写 一般都采用异步 点击 前台验证码图片 请求一次 : 前台图片代码: <img id="imgvalidatecode" sr ...

  8. 公客网beta阶段项目展示

    课程评价网站--公客网 为大学生选课排忧解难 公正客观的评课网站 为大学生提供发表自己看法的平台 为每一门课程打出公正的评分 beta阶段的新功能 beta阶段发布说明 评价的增删改 对课程发表评价 ...

  9. git重要命令

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

  10. git checkout 报错 refname 'origin/branch-name' is ambiguous

    When this happened, it created the file .git/refs/heads/origin/branch-name. So, I just deleted the f ...