1034 Head of a Gang (30分)
这题看清楚题的话,题目说两个人关系的质量取决于两个人所有通话时间的总和。
对于黑帮老大,就是和其他人关系质量最大的那个人。
然后读懂题之后就可以把关系定义成边,人定义成点,关系质量就是边权。
问题就转化成,求一个图上有几个连通块,每个连通块中,所具有边权最大的点是哪个。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e6+10;
unordered_map<string,int> mp1;
unordered_map<int,string> mp2;
map<string,int> ans;
long long weight[2010];
int g[2010][2010],vis[2010],ID=0;
int sum=0,cnt=0,head=-1,maxVal;
void dfs(int rt) {
if (weight[rt]>maxVal) {
maxVal=weight[rt];
head=rt;
}
vis[rt]=1;
cnt++;
for (int i=1;i<=ID;i++) {
if (g[rt][i]) {
sum+=g[rt][i];
g[rt][i]=g[i][rt]=0;
if (!vis[i]) dfs(i);
}
}
}
int main() {
// freopen("in.txt","r",stdin);
int N,K;
scanf("%d%d",&N,&K);
for (int i=1;i<=N;i++) {
char a[10],b[10];
int t;
scanf("%s%s%d",a,b,&t);
if (mp1[a]==0) {
mp1[a]=++ID;
mp2[ID]=a;
}
if (mp1[b]==0) {
mp1[b]=++ID;
mp2[ID]=b;
}
int u=mp1[a],v=mp1[b];
// printf("%d %d\n",u,v);
weight[u]+=t;
weight[v]+=t;
g[u][v]+=t;
g[v][u]+=t;
}
for (int i=1;i<=ID;i++) {
sum=0,cnt=0,head=0,maxVal=-1;
if (!vis[i]) {
dfs(i);
if (cnt>2&&sum>K) {
ans[mp2[head]]=cnt;
}
}
// printf("%d %d %d %d\n",sum,cnt,head,maxVal);
}
printf("%d\n",ans.size());
for (auto it:ans) {
cout<<it.first<<" "<<it.second<<endl;
}
return 0;
}