题意:求边权大于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; }