题意:成员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. VMware虚拟机创建安装之后不出现VMnet1和VMnet8虚拟网卡

    大家可能遇到过安装虚拟机之后,不出现这两张虚拟网卡,造成一系列的网络问题 VMware虚拟机无法将网络改为桥接状态 本人亲试可行的解决办法 首先把你之前安装的VMware虚拟机卸载,清理得一干二净: ...

  2. hdu4678 Mine 规律或者博弈。(博弈的sg函数不懂我是找的规律)

    链接:题意就是告诉你一个扫雷图里面每个雷的位置,有两个人,每个人都知道雷的确切位置,每个人一次可以点一部,问你谁能赢. 链接:http://acm.hdu.edu.cn/showproblem.php ...

  3. mysql服务1067错误:修改mysql可执行文件路径

    今天遇到mysql服务1067错误的问题,设置使用系统账户也无法启动mysql,后面认证看了系统的配置信息,发现启动文件也就是mysql安装路径是之前的(也说明之前安装mysql,没去卸载直接安装新的 ...

  4. redis的list类型以及其操作

    lists类型 给你个图;' lists类型以及操作List是一个链表结构,主要功能是push.pop.获取一个范围的所有值等等,操作中key理解为链表的名字.Redis的list类型其实就是每一个子 ...

  5. PentesterLab-PHP Include And Post Exploitation

    一.打开页面,看到这么个页面,按照惯例随手点一点 二.Login处显然是一个后台登录页面,但前提是的有账号密码,看了下Submit这个页面,发现url中有个page参数 三.nikto跑一下这个页面. ...

  6. Corosync+pacemaker实现集群的高可用

    一.Corosync和pacemaker的了解: Corosync是集群管理套件的一部分,他在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等.也就是说,corosync是Mess ...

  7. ThinkPHP 连接数据库

    今天在配置连接Mysql 时出现了bool(false)的提示,仔细修改了mysql的密码,还是不对,发现问题应该数据库本身设置了前缀tb_本身的拼写错误和注释掉了 'DB_PREFIX'=>' ...

  8. Android内存优化(四)解析Memory Monitor、Allocation Tracker和Heap Dump

    相关文章 Android性能优化系列 Java虚拟机系列 前言 要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具.本篇就来介绍内存 ...

  9. boost::function和boost:bind取代虚函数

    以boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是"继承就像一条贼船,上去就下不来了",而借助boost::function ...

  10. angular使用遇到的问题

    http://www.angularjs.cn/A0a6 用路由的时候,在js里写jquery的事件dom操作失效,只有在子页面里嵌套js才生效(jquery也不行).解决办法就是把dom操作用ng- ...