题意:成员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. windows下使用selenium报错selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH

    问题 :执行程序代码报错: WebDriverException:Message:'geckodriver'executable needs to be in Path 或者 selenium.com ...

  2. day24 Restful api 设计和CRM 客户关系管理

    博客: Restful: http://www.cnblogs.com/alex3714/articles/6808013.html http://www.cnblogs.com/alex3714/a ...

  3. 转:HDFS运行原理

    简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...

  4. [转载]java获取word文档的条目化内容

    在开发Web办公系统或文档系统时,PageOffice组件是众所周知的在线处理微软word/ppt/excel文档的强大工具,它对WORD文档的各种处理在API层面进行了封装,屏蔽了Office VB ...

  5. Java 进阶7 并行优化 JDK多任务执行框架技术

    Java 进阶7 并行优化 JDK多任务执行框架技术 20131114          Java 语言本身就是支持多线程机制的,他提供了 Thread 类 Runnable 接口等简单的多线程支持工 ...

  6. New Concept English there (4)

    20w/m These days, people who do manual work often receive far more money than people who work in off ...

  7. Java高级软件工程师面试题

    Java 软件高级工程师笔试题 [智力部分](30分) 1. 烧一根不均匀的绳要用一个小时,如何用它来判断半个小时?(5分) 两头同时烧 2. 4,4,10,10,加减乘除,怎么出24点?四个数字分别 ...

  8. defer async 区别

    链接 <script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是 ...

  9. c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)

    using System; using System.Text; namespace HuaTong.General.Utility { /// <summary> /// 自定义排序类 ...

  10. IOS开发 Application Kit框架的线程安全

    以下部分介绍了Application Kit框架的线程安全. 非线程安全类 以下这些类和函数通常是非线程安全的.大部分情况下,你可以在任何线程使用这些类,只要你在同一时间只有一个线程使用它们.查看这些 ...