给出n和k
接下来n行,每行给出a,b,c,表示a和b之间的关系度,表明他们属于同一个帮派
一个帮派由>2个人组成,且总关系度必须大于k。
帮派的头目为帮派里关系度最高的人。
(注意,这里关系度是看帮派里边的和,而不是帮派里所有个人的总和。
如果是按个人算的话,相当于一条边加了两次,所以应该是>2*k)
问你有多少个合格帮派,以及每个帮派里最大的头目是谁,按字典序输出

先并查集一下,然后统计每个帮的成员数、总关系度、以及头目

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <map> using namespace std;
const int maxn=(+)*;
map<string,int> maps;
string id_name[maxn];
int rel[maxn]; //每个人的weight
int vis[maxn];
struct Gang{
string name;
int num;
int tot=;
int maxweight=;
bool operator<(const Gang tmp)const{
if(name.compare(tmp.name)<=)
return true;
else
return false;
}
}gang[maxn];
//并查集
struct UF{
int fa[maxn];
int num[maxn];
void init(){
for(int i=;i<maxn;i++){
fa[i]=i;
num[i]=;
}
}
int find_root(int u){
if(fa[u]!=u)
fa[u]=find_root(fa[u]);
return fa[u];
}
void Union(int x,int y){
int fx=find_root(x);
int fy=find_root(y);
if(fx!=fy){
fa[fy]=fx;
num[fx]+=num[fy];
}
}
}uf; int main()
{
char str1[],str2[];
int a;
int cnt=;
int n,k;
uf.init();
memset(rel,,sizeof(rel));
scanf("%d %d",&n,&k);
for(int i=;i<n;i++){
cin>>str1>>str2;
scanf("%d",&a);
if(maps[str1]==){
maps[str1]=++cnt;
id_name[cnt]=str1;
}
if(maps[str2]==){
maps[str2]=++cnt;
id_name[cnt]=str2;
}
rel[maps[str1]]+=a;
rel[maps[str2]]+=a;
uf.Union(maps[str1],maps[str2]);
}
memset(vis,,sizeof(vis));
int gangcnt=;
//父亲一样的属于同一个组,建立父亲id与帮派之间的映射
for(int i=;i<=cnt;i++){
int group=uf.find_root(i);
if(!vis[group]){
vis[group]=++gangcnt;
gang[gangcnt].num=uf.num[group];
gang[gangcnt].tot+=rel[i];
gang[gangcnt].maxweight=rel[i];
gang[gangcnt].name=id_name[i];
}
else{
int id=vis[group];
gang[id].tot+=rel[i];
if(rel[i]>gang[id].maxweight){
gang[id].name=id_name[i];
gang[id].maxweight=rel[i];
}
}
}
sort(gang+,gang+gangcnt+);
int ans=;
for(int i=;i<=gangcnt;i++){
//tot要除以2,因为一条边的weight加了2次
if(gang[i].num>&&gang[i].tot/>k){ ans++;
}
}
printf("%d\n",ans);
for(int i=;i<=gangcnt;i++){
if(gang[i].num>&&gang[i].tot/>k){
cout<<gang[i].name<<" "<<gang[i].num<<endl;
}
}
return ;
}

PAT甲题题解-1034. Head of a Gang (30)-并查集的更多相关文章

  1. PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789138.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. PAT甲题题解-1053. Path of Equal Weight (30)-dfs

    由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...

  3. PAT甲题题解-1064. Complete Binary Search Tree (30)-中序和层次遍历,水

    由于是满二叉树,用数组既可以表示父节点是i,则左孩子是2*i,右孩子是2*i+1另外根据二分搜索树的性质,中序遍历恰好是从小到大排序因此先中序遍历填充节点对应的值,然后再层次遍历输出即可. 又是一道遍 ...

  4. PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树

    根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...

  5. PAT甲题题解-1068. Find More Coins (30)-dp,01背包

    一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...

  6. PAT甲题题解-1008. Elevator (20)-大么个大水题,这也太小瞧我们做题者的智商了

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <cstr ...

  7. PAT甲题题解-1010. Radix (25)-二分搜索

    题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...

  8. PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。

    题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊,所以最后输出的是sum+0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么 ...

  9. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

随机推荐

  1. MySQL核心之双一原则

    所谓的双一就是指: sync_binlog=; innodb_flush_log_at_trx_commit= innodb_flush_log_at_trx_commit和sync_binlog这两 ...

  2. Hadoop HBase概念学习系列之HMaster服务器(四)

    每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每个HRegion服务器它要维护哪些HRegion. 当一台新的HRegion服务器登录到HMaster服务器时 ...

  3. [LOJ 2146][BZOJ 4873][Shoi2017]寿司餐厅

    [LOJ 2146][BZOJ 4873][Shoi2017]寿司餐厅 题意 比较复杂放LOJ题面好了qaq... Kiana 最近喜欢到一家非常美味的寿司餐厅用餐. 每天晚上,这家餐厅都会按顺序提供 ...

  4. 026.7 网络编程 URL对象

    通过一个程序理解Java的url对象. String str_url = "http://127.0.0.1:8080?name=xxx"; URL url = new URL(s ...

  5. objc.io 待看文章

    https://objccn.io/issues/ https://objccn.io/issues/ 使用 VIPER 构建 iOS 应用 并发编程

  6. PAT B1034 有理数四则运算 (20 分)

    本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前 ...

  7. Python2.7-shutil

    shutil 模块,高级文件操作模块,支持文件或文件夹的复制和删除 模块方法: shutil.copyfileobj(fsrc, fdst[, length]):将类文件对象(在python中打开的文 ...

  8. JAVA框架 Spring 引入多个配置文件

    1.如果配置文件比较长,可以分多个配置文件.有两种方式: 1)在主配置文件加标签<import/> <import resource="jd/com/other/appli ...

  9. ansible-playbook如何判断并中断执行

    - fail: msg="Bailing out. this play requires 'bar'"       when: bar is not defined 我的需求是当某 ...

  10. mysql的常用优化知识

    索引类型:主键索引,唯一索引,联合索引,普通索引,全文索引 建立索引: create index index_name on table(field_name); 删除索引: drop index i ...