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那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...
随机推荐
- 移动端真机调试抓包,fiddler web debugger
小白一枚,在公司大神指导下加之找了好多资料才勉强将fiddler的使用摸透,果然很好用. 一.设置手机 二.设置fiddler
- vs2008编译openssl,静态库/动态库,批处理
::前期准备准备工作::1,下载安装好ActivePerl,::2,下载Openssl源码::3,本机有安装vc::4,此例在vs2008(vc9),openssl-1.0.2o下完成 echo of ...
- 【Alpha 冲刺】 10/12
今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成app端api编写 未完成 Json格式出了点问题,修复中 孙浩楷 图片在线编辑器插件引入 未完成 耦合了,结果另外一个那边做 ...
- redis 持久化与备份策略
持久化(persistence) 本文是 Redis 持久化文档 的中文翻译. 这篇文章提供了 Redis 持久化的技术性描述,推荐所有 Redis 用户阅读. 要更广泛地了解 Redis 持久化,以 ...
- 解决Windows Server2008 R2中IE开网页时弹出阻止框
使用Windows Server2008,用IE打开网站时会弹出“Internet Explorer增强安全配置正在阻止来自下列网站的此应用程序中的内容”的对话框.如下图所示: 2011-10-14_ ...
- VC基于单文档OpenGL框架
本文是在VC6.0的环境下,运用MFC实现的OpenGL最基本框架,需要简单了解MFC编程(会在VC6.0里创建MFC单文档应用程序就行),甚至不必了解OpenGL的知识.以下是具体的步骤. 1.创建 ...
- JAVA框架 Spring 调用jdbcsuport简化开发
一)使用DAO的jdbcsuport来简化开发 首先来清楚一个概念: 我们在进行配置文件来进行依赖注入的时候,主要是通过set方法来进行设置的. 正常我们使用spring的jdbctemplate的时 ...
- 将EF项目从dbfirst转化为codefirst
一个脚本服务的项目,之前是先设计的数据库表,采用EF的dbfirst做的映射.项目完成后,出现迁移瓶颈. 1.dbfirst项目,如果数据库表结构做了调整,需要重新映射 2.当出现表结构一致,但数据库 ...
- 图文列表,关于Simpleadapter
main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- docker 端口映射错误解决方法
今天搞了半天shipyard,在网页上打开时无法显示容器和镜像,最后发现是docker端口映射错误,由于防火墙未关闭: 4月 12 18:51:29 localhost firewalld[757]: ...