超级无敌复杂的并查集,先将所有输入保存排序,再合并已实现权值最大为根节点 #include<iostream> #include<vector> #include<map> using namespace std; int father[27]; //用1到26代表所有的帮派 int wei[27]; struct input { int a, b; int weight; }; struct gang { int name; int weight =0; }; void Init() { for (int i = 1; i <= 26; i++) { father[i] = i; wei[i] = 0; } } int Find(int x) { if (father[x] != x) { father[x] = Find(father[x]); } return father[x]; } void Union(int x, int y,gang g[]) { x = Find(x); y = Find(y); if (x != y) { if(g[x].weight > g[y].weight) father[y] = x; else { father[x] = y; } } } int main() { int n, m; while (cin >> n >> m) { Init(); vector<input> vec1; gang g[27]; int length; for (int i = 0; i < n; i++) { //将所有帮派输入 string str1, str2; int weight; cin >> str1 >> str2 >> weight; length = str1.size(); int a = str1[0] - 'A'+1, b = str2[0] - 'A'+1; input temp1; temp1.a = a; temp1.b = b; temp1.weight = weight; vec1.push_back(temp1); g[a].name = a; g[a].weight += weight; g[b].name = b; g[b].weight += weight; //记录所有的权值 } for(int i=0;i<vec1.size();i++){ Union(vec1[i].a, vec1[i].b,g); } map<int, int> mymap1,mymap2; for (int i = 1; i <= 26; i++) { mymap1[Find(i)] ++; //找到所有的帮派 mymap2[Find(i)] += g[i].weight; } int index=0; for (int i = 1; i <= 26; i++) if (mymap1[i] > 2 && mymap2[i] > m*2) index++; cout << index << endl; for (int i = 1; i <= 26; i++) { if (mymap1[i] > 2&& mymap2[i] > m*2 ) { char temp = 'A' + i - 1; for (int index = 0; index < length; index++) { cout << temp; } cout << ' ' << mymap1[i] << endl; } } } }