题意:成员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. clientWidth、offsetWidth等介绍

    网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...

  2. 【网络编程】inet_addr、inet_ntoa、inet_aton、inet_ntop和inet_pton区分

    先上一张图 1.把ip地址转化为用于网络传输的二进制数值 int inet_aton(const char *cp, struct in_addr *inp); inet_aton() 转换网络主机地 ...

  3. ios8 - CoreLocation定位服务的变化

    在iOS8开发中,发现一个CoreLocation的使用问题,执行操作之后,不会调用到定位之后的delegate方法中. 根据文档,需要在使用CoreLocation前调用方法: [locationm ...

  4. LVS模式一:直接路由模式DR(Direct Routing)

    (一)LVS 一.LVS的了解 LVS(Linux Virtual Server)可以理解为一个虚拟服务器系统. Internet的飞速发展,网络带宽的增长,Web服务中越来越多地使用CGI.动态主页 ...

  5. 解析xml节点属性及子节点内容

    xml样例 <microNearlyThreeYearsOverdueInfo subReportType="13204" subReportTypeCost="9 ...

  6. 制作smarty模版缓存文件

    <?php$p = 1;if(!empty($_GET["page"])){ $p = $_GET["page"];} $filename = " ...

  7. (转)MapReduce Design Patterns(chapter 4 (part 1))(七)

    Chapter 4. Data Organization Patterns 与前面章节的过滤器相比,本章是关于数据重组.个别记录的价值通常靠分区,分片,排序成倍增加.特别是在分布式系统中,因为这能提高 ...

  8. select2切换事件如何生效

    1.问题背景 利用select2生成可搜索下拉框,并且绑定切换事件:但是直接绑定change事件,发现不起作用 2.问题原因 <!DOCTYPE html> <html> &l ...

  9. Java之JVM逃逸分析

    引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景. 概念 逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配 ...

  10. [置顶] Android 关于SP读取与存储正确打开方式?

    一.存储方式分类:SharedPreferences存储 二.SharedPreferences存储 1.特点 ①存储单一数据,例如数值,字符串,布尔 ②文件:/date/date/包名/shared ...