#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
//struct Gang{
// int head;
// int numMember;
//}arrayGang[2010];
//bool cmp(Gang a,Gang b){
// return a.head<b.head;
//}
map<string,int> Gang;
map<string,int> m;
map<int,string> n;
bool visit[2010]={false};
//保存 点权值
int weight[2010]={0};
//邻接矩阵 保存边权
int G[2010][2010];
int N,K;
//总人数
int numPerson =0;
void DFS(int nowVisit,int& head,int& numMember,int& totalWeight){
//人数累加1
numMember++;
//标记已经访问当前结点
visit[nowVisit] = true;
if(weight[nowVisit]>weight[head]){
head = nowVisit;
}
for(int i=0 ;i<numPerson;i++){
//如果有边才继续DFS
if(G[nowVisit][i]>0){
//累加总权
totalWeight = totalWeight + G[nowVisit][i];
G[nowVisit][i] = G[i][nowVisit] = 0;//删除边 防止回头
if(visit[i]== false){
DFS(i,head,numMember,totalWeight);
}
}
}
}
int index =0;
int sum = 0;
void DFSTrave(){
for(int i=0;i<numPerson ;i++){
if(visit[i]==false){
int head = i,numMember =0,totalValue =0;
DFS(i,head,numMember,totalValue);
if(numMember>2&&totalValue>K){
Gang[n[head]] = numMember;
}
}
}
}
int strToNum(string str){
if(m.find(str)!=m.end()){
return m[str];
} else{
m[str] = numPerson;
n[numPerson] = str;
return numPerson++;
}
}
int main() {
int w ;
string str1,str2;
cin>>N>>K;
for(int i =0;i<N;i++){
cin>>str1>>str2>>w;
int id1 = strToNum(str1);
int id2 = strToNum(str2);
weight[id1]+=w;
weight[id2]+=w;
G[id1][id2]+=w;
G[id2][id1]+=w;
}
// cout<<numPerson<<endl;
DFSTrave();
// sort(arrayGang,arrayGang+sum,cmp);
cout<<Gang.size()<<endl;
for(auto it:Gang){
cout<<it.first<<" "<<it.second<<endl;
}
return 0;
}
浙江大学PAT甲级A1034(C++)题解
最新推荐文章于 2022-03-31 12:08:15 发布