#include<iostream> #include<string> #include<map> using namespace std; const int maxn=2010; map<int, string>intToString; map<string,int>stringToInt; map<string,int>Gang; int G[maxn][maxn]={0},weight[maxn]={0}; int n,k,numPerson=0; bool vis[maxn]={false}; void DFS(int nowVisit,int& head,int& numMember,int& totalValue){ numMember++; vis[nowVisit]=true; if(weight[nowVisit]>weight[head]){ head=nowVisit; } for(int i=0;i<numPerson;i++){ if(G[nowVisit][i]>0){ totalValue+=G[i][nowVisit]; G[nowVisit][i]=G[i][nowVisit]=0; if(vis[i]==false){ DFS(i,head,numMember,totalValue); } } } } void DFSTrave(){ for(int i=0;i<numPerson;i++){ if(vis[i]==false){ int head=i,numMember=0,totalValue=0; DFS(i,head,numMember,totalValue); if(numMember>2&&totalValue>k){ Gang[intToString[head]]=numMember; } } } } int changed(string str){ if(stringToInt.find(str)!=stringToInt.end()){ return stringToInt[str]; }else{ stringToInt[str]=numPerson; intToString[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=changed(str1); int id2=changed(str2); weight[id1]+=w; weight[id2]+=w; G[id1][id2]+=w; G[id2][id1]+=w; } DFSTrave(); cout<<Gang.size()<<endl; map<string,int>::iterator it; for(it=Gang.begin();it!=Gang.end();it++){ cout<<it->first<<" "<<it->second<<endl; } return 0; }
Head of a Gang
最新推荐文章于 2022-11-20 12:36:46 发布
本文介绍了一种利用图论算法解决社交网络中团队组建问题的方法。通过深度优先搜索(DFS)寻找最具价值的三人组合,同时确保每个团队的连通性。通过`intToString`和`stringToInt`映射,将成员ID转换为字符串并统计最大价值Gang。主要关注了字符串转换、权重计算和团队优化过程。
摘要由CSDN通过智能技术生成