AcWing 1518. 团伙头目
原题链接
中等
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
int n,k;
unordered_map<string,vector<string>> g;//每个人都有一个自己的通话对象名字的数组。
unordered_map<string,int> total;//每个人各自的通话时间总长
unordered_map<string,bool> st;//判断是否计算过某个人的通话时长
int dfs(string name,vector<string>&nodes){
st[name]=true;
nodes.push_back(name);
int sum=total[name];
for(auto c:g[name]) if(!st[c]) sum+=dfs(c,nodes);
return sum;
}
int main(){
scanf("%d %d",&n,&k);
while(n--){
string name_1,name_2;
int time;
cin>>name_1>>name_2>>time;
g[name_1].push_back(name_2), g[name_2].push_back(name_1);
total[name_1]+=time, total[name_2]+=time;
}
vector<pair<string,int>>res;
for(auto c:total){
string name=c.first;
vector<string> nodes;
int sum=0;
if(!st[name]) sum=dfs(name,nodes)/2;
if(sum>k&&nodes.size()>2){
string boss=nodes[0];
for(auto temp: nodes) if(total[temp]>total[boss]) boss=temp;
res.push_back({boss,nodes.size()});
}
}
sort(res.begin(),res.end());
printf("%d\n",res.size());
for(auto c: res) printf("%s %d\n",c.first.data(),c.second);
return 0;
}