PAT甲级1034 Head of a Gang

AC代码

#include<bits/stdc++.h>
using namespace std;
int father[2001],n,k,cn=0;
int num[2001],w[2001],w1[2001];
map<string,int> sti;
map<int,string> its;
struct Head{
    string s;
    int num;
};
bool cmp(Head a,Head b)
{
    return a.s<b.s;
}
int conv(string s)
{
    if(sti.find(s)!=sti.end())
    {
        return sti[s];
    }else{
        sti[s]=cn;
        its[cn]=s;
        return cn++;
    }
}
int findfather(int i)
{
    if(father[i]==i) return i;
    else return findfather(father[i]);
}
void change(int a,int fa)
{
	father[fa]=a;
    father[a]=a;
    num[a]=num[fa];num[fa]=1;
    w1[a]=w1[fa];w1[fa]=0;
}
void Union(int a,int b,int t)
{
    int fa=findfather(a);
    if(w[fa]<w[a]){
    	change(a,fa);
    }
    int fb=findfather(b);
    if(w[fb]<w[b]){
    	change(b,fb);
    }
    fa=findfather(a);
    fb=findfather(b);
    if(fa!=fb)
    {
        if(w[fa]<w[fb]) {
            int change=fa;
            fa=fb;fb=change;
        }
        father[fb]=fa;
        num[fa]+=num[fb];num[fb]=1;
        w1[fa]+=w1[fb];w1[fb]=0;
    } 
    w1[fa]+=t;
}
int main()
{
	scanf("%d%d",&n,&k);
    for(int i=0;i<2001;i++){
    	father[i]=i;
    	num[i]=1;
    	w[i]=0;
    	w1[i]=0;
    }
    int t;
    string s1,s2;
    for(int i=0;i<n;i++)
    {
        cin>>s1>>s2>>t;
        int id1=conv(s1),id2=conv(s2);
        w[id1]+=t;
        w[id2]+=t;
        Union(id1,id2,t);
    }
    vector<Head> v;
    for(int i=0;i<cn;i++)
    {
        if(father[i]==i)
        {
            if(num[i]>2&&w1[i]>k)
            {
                Head temp;
                temp.s=its[i];
                temp.num=num[i];
                v.push_back(temp);
            }
        }
    }
    int size=v.size();
    sort(v.begin(),v.end(),cmp);
    printf("%d\n",size);
    for(int i=0;i<size;i++)
    {
        cout<<v[i].s<<" "<<v[i].num<<endl; 
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值