zoukankan      html  css  js  c++  java
  • PAT A1034 Head Of Gang

    用并查集分割团伙,判断输出~

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=10010;
    int father[maxn],isRoot[maxn]={0},weight[maxn];
    unordered_map<string,int> pos1;
    unordered_map<int,string> pos2;
    unordered_map<string,int> ans;
    struct node {
        string id;
        int total=0;
        int num=0;
    }Node[maxn];
    struct gang {
        string id;
        int num;
    };
    void init () {
        for (int i=0;i<maxn;i++) 
        father[i]=i;
    }
    int findfather (int x) {
        int a=x;
        while (x!=father[x]) 
        x=father[x];
        while (a!=father[a]) {
            int z=a;
            a=father[a];
            father[z]=x;
        }
        return x;
    }
    void Union (int a,int b) {
        int faA=findfather(a);
        int faB=findfather(b);
        if (faA!=faB) {
            if (weight[faA]>weight[faB]) father[faB]=faA;
            else father[faA]=faB;
        }
    }
    bool cmp (gang a,gang b) {
        return a.id<b.id;
    }
    int main () {
        int N,K;
        scanf ("%d %d",&N,&K);
        init ();
        string s1,s2;
        int cnt=1,x;
        vector<pair<string,string>> v1;
        for (int i=0;i<N;i++) {
            cin>>s1>>s2>>x;
            if (pos1[s1]==0) {
                pos1[s1]=cnt;
                pos2[cnt++]=s1;
            }
            if (pos1[s2]==0) {
                pos1[s2]=cnt;
                pos2[cnt++]=s2;
            }
            weight[pos1[s1]]+=x;
            weight[pos1[s2]]+=x;
            v1.push_back({s1,s2});
        }
        for (int i=0;i<v1.size();i++)
        Union (pos1[v1[i].first],pos1[v1[i].second]);
        for (int i=1;i<cnt;i++) {
            Node[findfather(i)].total+=weight[i];
            Node[findfather(i)].num++;
        }
        for (int i=1;i<cnt;i++) {
            if (Node[i].total>K*2&&Node[i].num>2) 
            ans[pos2[i]]=Node[i].num;
        }
        printf ("%d
    ",ans.size());
        vector<gang> vi;
        for (auto it=ans.begin();it!=ans.end();it++)
        vi.push_back({it->first,it->second});
        sort (vi.begin(),vi.end(),cmp);
        for (int i=0;i<vi.size();i++)
        cout<<vi[i].id<<" "<<vi[i].num<<endl;
        return 0;
    }
  • 相关阅读:
    RollingFileAppender 日志按天记录输出到log文件
    spring boot jar包开机自启
    oracle 日常操作--触发器调试
    转载:java基础-String不可变的好处
    java 代码优化
    nginx部署ssl证书
    修改npm仓库地址
    linux下安装python3
    python一行代码开启http
    linux下安装mongodb
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12301681.html
Copyright © 2011-2022 走看看