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;
}