PAT

xiaoxiao2021-02-28  84

// // main.cpp // PAT_1034. Head of a Gang // // Created by wjq on 17/4/29. // Copyright © 2017年 wjq. All rights reserved. // #include <iostream> #include <map> #include <algorithm> #include <vector> using namespace std; int N,K,id=0,wei; string A,B; map <string,int> m; map <int,string> mm; int p[2010]; //用来统计某个老大的权重 int father[2010]; //用来记录某个小弟的老大是谁 int r[2010]; //用来统计某个老大拥有的小弟个数 struct fa { int maxW; //用来记录团队中的总权重*2 int sumW; //用来记录团队中权重最大的那个人的权重 string nowfather; //用来记录团队中权重最大的人名 }; map<int,fa> result; void Init() { for(int i=0;i<2010;i++) { p[i]=0; father[i]=i; r[i]=1; } } int Find(int x) { while(x!=father[x]) x=father[x]; return x; } void Union(int x,int y) { int fx=Find(x),fy=Find(y); if(fx!=fy) { father[fy]=fx; r[fx]+=r[fy]; } } int main(int argc, const char * argv[]) { Init(); cin>>N>>K; for(int i=0;i<N;i++) { cin>>A>>B>>wei; if(m.find(A)==m.end()) //如果字符串A未出现过 { m[A]=id; //给字符串A一个编号 mm[id]=A; p[id]+=wei; //该编号下的权重增加 id++; } else p[m[A]]+=wei; if(m.find(B)==m.end()) { m[B]=id; mm[id]=B; p[id]+=wei; id++; } else p[m[B]]+=wei; Union(m[A],m[B]); } int resu[2010];int k=0; for(int i=0;i<id;i++) { int root=Find(i); if(result.find(root)==result.end()) { fa temp; temp.maxW=p[i]; temp.nowfather=mm[i]; temp.sumW=p[i]; result[root]=temp; resu[k++]=root; } else { result[root].sumW+=p[i]; if(p[i]>result[root].maxW) { result[root].maxW=p[i]; result[root].nowfather=mm[i]; } } } int ans=0; pair<string,int> g[2010];int sb=0; for(int i=0;i<k;i++) if(r[resu[i]]>2&&result[resu[i]].sumW/2>K) { ans++; g[sb++]=make_pair(result[resu[i]].nowfather, r[resu[i]]); } sort(g,g+ans); cout<<ans<<endl; for(int i=0;i<ans;i++) cout<<g[i].first<<" "<<g[i].second<<endl; return 0; }

这题用并查集做,stl的合理运用能够加快解题速度.

转载请注明原文地址: https://www.6miu.com/read-37363.html

最新回复(0)