1034 Head of a Gang (30 分) 难度: 中 / 知识点: 并查集
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1034 Head of a Gang (30 分) 难度: 中 / 知识点: 并查集相关的知识,希望对你有一定的参考价值。
https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624
首先不难想到的是并查集,不过这里有一个关键的一点就是是字符串不是数字。
所以可以用哈希表来将字符串和数字编号来一一对应的映射起来。
其它的就是基本的并查集即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
struct node
{
string name;
int cnt;
}Node;
bool cmp(node a,node b) {return a.name<b.name;}
vector<node>ans;//答案
int p[N],cnt[N],sum[N],val[N],idx=1;//sum就是一个集合总的值,val是每一个人单独的值
int n,k;
unordered_map<string,int>hush1;//字符串到编号的映射
unordered_map<int,string>hush2;//编号到字符串的映射
unordered_map<int,vector<int>>mp;//每一个集合
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(void)
{
cin>>n>>k;
for(int i=1;i<=n;i++) p[i]=i,cnt[i]=1;
for(int i=1;i<=n;i++)
{
string a,b;
int t;
cin>>a>>b>>t;
if(!hush1.count(a)) hush1[a]=idx++;//映射成唯一的编号
hush2[hush1[a]]=a;
if(!hush1.count(b)) hush1[b]=idx++;
hush2[hush1[b]]=b;
if(find(hush1[a])!=find(hush1[b]))//不再同一个集合
{
cnt[find(hush1[b])]+=cnt[find(hush1[a])];
sum[find(hush1[b])]+=sum[find(hush1[a])]+t;
val[hush1[a]]+=t;
val[hush1[b]]+=t;
p[find(hush1[a])]=find(hush1[b]);
}
else //在同一个集合
{
val[hush1[a]]+=t;
val[hush1[b]]+=t;
sum[find(hush1[b])]+=t;
}
}
for(int i=1;i<=n;i++) mp[find(i)].push_back(i);//将其每一个值都存到对应的集合里
for(auto i=mp.begin();i!=mp.end();i++)//枚举所有的集合
{
auto temp=i->second;
if(temp.size()<3) continue;//人数不够
if(sum[i->first]<=k) continue;//总分不够
int index=0;
for(int j=0;j<temp.size();j++)//找到集合中个人分最大的值
{
if(val[temp[j]]>val[temp[index]]) index=j;
}
Node.name=hush2[temp[index]];
Node.cnt=temp.size();
ans.push_back(Node);
}
cout<<ans.size()<<endl;
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++) cout<<ans[i].name<<" "<<ans[i].cnt<<endl;
return 0;
}
以上是关于1034 Head of a Gang (30 分) 难度: 中 / 知识点: 并查集的主要内容,如果未能解决你的问题,请参考以下文章
PAT 甲级 1034 Head of a Gang (30 分)(bfs,map,强连通)