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 分) 难度: 中 / 知识点: 并查集的主要内容,如果未能解决你的问题,请参考以下文章

1034 Head of a Gang (30分)

PAT 甲级 1034 Head of a Gang (30 分)(bfs,map,强连通)

A1034 Head of a Gang (30分)

PAT 1034 Head of a Gang[难]

1034 Head of a Gang (30 分) 难度: 中 / 知识点: 并查集

1034. Head of a Gang (30)