pat 1034. Head of a Gang (30)

题意:求边权大于k并且点数大于2的联通块,输出其中的重要点,重要点:联通块中与该点相连的边权最大

丢set里乱搞

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;

set<int> s[maxn];
int f[maxn],n,k,g[maxn];
int gg[maxn];
void init(){
    for(int i=1;i<=2*n;i++)s[i].insert(i),f[i]=i;
}

void uoin(int i,int j,int w){
    i=f[i];j=f[j];
    if(i==j){g[i]+=w;return ;}
    if(i>j)swap(i,j);
    for(auto x: s[j]){
        f[x]=i;
        s[i].insert(x);
    }
    g[i]+=g[j]+w;
    s[j].clear();
}
//编号
map<string,int> no;
map<int,string> on;
int tot=1;
int newnode(string s){
    if(no[s]==0)
        no[s]=tot,on[tot]=s,tot++;
    return no[s];
}

int main(){
    cin>>n>>k;
    init();
    string s1,s2;int w;
    for(int i=1;i<=n;i++){
        cin>>s1>>s2>>w;
        int a=newnode(s1),b=newnode(s2);
        gg[a]+=w;gg[b]+=w;
        uoin(a,b,w);
    }

    vector<pair<string,int> > q;
    for(int i=1;i<tot;i++){
        if(s[i].size()<=2||g[i]<=k)continue;
        int ans=-1,_max=0;
        for(auto x: s[i]){
            if(gg[x]>_max)_max=gg[x],ans=x;
        }
        q.push_back(make_pair(on[ans],s[i].size()));
    }
    cout<<q.size()<<endl;
    sort(q.begin(),q.end());
    for(auto pr:q) {
        cout<<pr.first<<" "<<pr.second<<endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/jihe/p/6113778.html