PAT甲题题解-1034. Head of a Gang (30)-并查集
给出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)-并查集的更多相关文章
- PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789138.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT甲题题解-1053. Path of Equal Weight (30)-dfs
由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...
- PAT甲题题解-1064. Complete Binary Search Tree (30)-中序和层次遍历,水
由于是满二叉树,用数组既可以表示父节点是i,则左孩子是2*i,右孩子是2*i+1另外根据二分搜索树的性质,中序遍历恰好是从小到大排序因此先中序遍历填充节点对应的值,然后再层次遍历输出即可. 又是一道遍 ...
- PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树
根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...
- PAT甲题题解-1068. Find More Coins (30)-dp,01背包
一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...
- PAT甲题题解-1008. Elevator (20)-大么个大水题,这也太小瞧我们做题者的智商了
如题... #include <iostream> #include <cstdio> #include <algorithm> #include <cstr ...
- PAT甲题题解-1010. Radix (25)-二分搜索
题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...
- PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。
题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊,所以最后输出的是sum+0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么 ...
- PAT甲题题解-1012. The Best Rank (25)-排序水题
排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...
随机推荐
- 端口扫描--zmap
ZMap被设计用来针对整个IPv4地址空间或其中的大部分实施综合扫描的工具.ZMap是研究者手中的利器,但在运行ZMap时,请注意,您很有 可能正在以每秒140万个包的速度扫描整个IPv4地址空间 . ...
- 小渣渣的json和jsonp和ajax的实质和区别
json和jsonp和ajax的实质和区别ajax的两个问题 1.ajax以何种格式来交换数据 2.跨域的需求如何解决 数据跨域用自定义字符串或者用XML来描述 跨域可以用服务器代理来解决jsonp来 ...
- Django商城项目笔记No.4用户部分-注册接口-图片验证码
Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...
- vue问题总结
1.通过判断绑定class及点击事件总结<a :class='[item.status=="yes" ? `btn-primary` : `btn-danger`]' :ti ...
- 【转】通过blob获取图像并显示
HTML代码: <div id="forAppend" class="demo"></div> JS代码: var eleAppend ...
- PHP(Mysql/Redis)消息队列的介绍及应用场景案例--转载
郑重提示:本博客转载自好友博客,个人觉得写的很牛逼所以未经同意强行转载,原博客连接 http://www.cnblogs.com/wt645631686/p/8243438.html 欢迎访问 在进行 ...
- kubernetes lable 操作
我们要给已创建的Pod“redis-master”添加一个标签role=master: $ kubectl label pod redis-master role=master 查看该Pod的Labe ...
- git回答整理
1.git常用命令 首先明确:git有工作区.暂存区.版本库,工作区是电脑里能看到的目录 创建仓库: git init newrepo,使用我们指定目录作为Git仓库(初始化后,会在newrepo目录 ...
- pyspider中内容选择器常用方法汇总
pyspider 的内容选择器默认已经实例化一个pyquery对象,可以直接使用pyquery的api来获取自己需要的内容. 1.在pyquery中使用response.doc就可以直接实例化一个py ...
- 通过SSH秘钥登录线上MySQL数据库(基于Navicat)
前言 生产环境的数据库往往需要经过严格的安全限制,所以禁用密码登录,使用秘钥的方式是一种相对安全的登录方式. 原理: 角色: 主机A:其他主机,有访问线上数据库的权限 主机B:线上数据库的主机 主机C ...