#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
/*输入处理,输入n,k,接下来n行,将string转换成int,将点权累加,构建邻接矩阵,
编写change函数,使用map,若map当前没有此字符串,则加入,若有则直接返回对应的编号
遍历图,对每个块进行处理,若人数大于2,总权值大于k,将头目和对应的人数存到map中
如何遍历某个块并求出该块的总边权,总点权/2可以否?
*/
#define maxn 2020
int G[maxn][maxn]={0};
int n,k;
int index;
bool vis[maxn]={false};
int vpower[maxn]={0};
map<string,int>strtoint;
map<int,string>inttostr;
map<string,int>boss;
int change(string str)
{
if(strtoint.find(str)==strtoint.end()){//不在map中
inttostr[index]=str;
return strtoint[str]=index++;
}
else{
return strtoint[str];
}
}
void DFS(int nowVisit,int &head,int &numMember,int &totalvalue)
{
totalvalue+=vpower[nowVisit]/2;
numMember++;
if(vpower[nowVisit]>vpower[head]){
head=nowVisit;
}
vis[nowVisit]=true;
for(int i=0;i<index;i++){
if(vis[i]==false&&G[nowVisit][i]!=0){
DFS(i,head,numMember,totalvalue);
}
}
}
void DFSG()
{
for(int i=0;i<index;i++){
if(vis[i]==false){
int head=i,numMember=0,totalvalue=0;
DFS(i,head,numMember,totalvalue);
if(numMember>2&&totalvalue>k){
boss[inttostr[head]]=numMember;
}
}
}
}
int main()
{
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
string str1,str2;
int t;
cin>>str1>>str2>>t;
int m=change(str1);
int n=change(str2);
vpower[m]+=t;
vpower[n]+=t;
G[m][n]+=t;
G[n][m]+=t;
}
DFSG();
if(boss.size()==0){
printf("0\n");
}
else{
printf("%d\n",boss.size());
for(map<string,int>::iterator it=boss.begin();it!=boss.end();it++){
cout<<it->first<<' '<<it->second<<endl;
}
}
}
PAT A 1034
最新推荐文章于 2022-02-19 00:02:52 发布