PAT1034. Head of a Gang ——离散化+并查集
题意:成员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 ——离散化+并查集的更多相关文章
- BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)
4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 689 Solved: 296 [Submit][Sta ...
- PAT甲题题解-1034. Head of a Gang (30)-并查集
给出n和k接下来n行,每行给出a,b,c,表示a和b之间的关系度,表明他们属于同一个帮派一个帮派由>2个人组成,且总关系度必须大于k.帮派的头目为帮派里关系度最高的人.(注意,这里关系度是看帮派 ...
- AcWing:237. 程序自动分析(离散化 + 并查集)
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xjxi=x ...
- POJ 2513 Colored Sticks (离散化+并查集+欧拉通路)
下面两个写得很清楚了,就不在赘述. http://blog.sina.com.cn/s/blog_5cd4cccf0100apd1.htmlhttp://www.cnblogs.com/lyy2890 ...
- 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- [BZOJ1370][Baltic2003]Gang团伙 并查集+拆点
Description 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个 ...
- acdream 1725 哗啦啦的小彭玉染色问题 离散化并查集
哗啦啦的小彭玉染色问题 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1725 Descri ...
- 【bzoj1370】[Baltic2003]Gang团伙 并查集
题目描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信息, ...
随机推荐
- ansible 调用playbook api执行(一)
一 调用ansible playbook api执行playbook 1 准备好hosts文件 root@ansible:~/ansible/playbooks# cat hosts [all:var ...
- eclipse安装插件:
eclipse安装插件:jre跟eclipse的bit数必须匹配,即必须都是32or64位的 历史版本不好找,pydev的历史版本在sourceforge中很隐蔽,得在项目的activite中查找,另 ...
- ParentNodes、childNodes、children之间的区别
"parentNode" 常用来获取某个元素的父节点. 把 parentNodes 理解为容器, 在容器中有个子节点 例: <div id="parent" ...
- C/C++文件指针偏移
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- linux系统挂载NTFS移动硬盘
有时候做大数据量迁移时,为了快速迁移大数据,有可能在Linux服务器上临时挂载NTFS格式的移动硬盘, 一般情况下,Linux是识别不了NTFS格式移动硬盘的(需要重编译Linux核心才能,加挂NTF ...
- tooltip提示框组件
Tooltip 提示框组件 可独立于其他组件通过$.fn.tooltip.defaults重写默认的defaults.当用户移动鼠标指针在某个元素上时,出现提示信息窗口来显示额外信息.提示内容可以包含 ...
- 在Vim中使用gtags
之前一直使用vim+ctags+cscope来弄c的代码,最近看同事使用gtags,觉得在搜索方面要高级很多,网上大多都是emacs+gtags的资料,而vim的则比较少,这里搞通了之后,做个记录. ...
- python爬虫入门(3)-环境搭建
下载集成包 链接:http://pan.baidu.com/s/1pKD2zBP 密码:f75b 这里采用python2.7.9 安装步骤:1.安装python2.7(默认安装即可) 2.打开“运 ...
- learn go recursive
package main // 参考文章: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.6.md im ...
- 隐居网V2.0
经过一个月加班加点的努力,我们终于把隐居网V2.0版做好了(一个设计两个前端三个程序).上一版的隐居网因为经验不够底层架构没搭好(前台和后台都是),又是赶工期,导致后面越做越坑爹.所谓从哪里跌倒从哪里 ...