[HDU - 2860]Regroup
并查集。
新兵入伍。三种操作:①入伍②合并队伍③查找一个队伍里面战斗力最弱的。注意队伍编号从0开始。
多了一个记录每个集合最小值的minn数组而已,然后判断的时候小心一点就可以了。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define maxn 200000 + 10 #define inf 0x3f3f3f3f int father[maxn]; int minn[maxn]; int Find(int x){ return father[x] == x ? x : father[x] = Find(father[x]); } int n, k, m; int main() { while (~scanf("%d %d %d", &n, &k, &m)) { for (int i = 0; i < n; i++) { father[i] = i; minn[i] = inf; } int ans = 0; for (int i = 0; i < k; i++) { int belong; int val; scanf("%d %d", &val, &belong); minn[belong] = min(minn[belong], val); } for (int i = 0; i < m; i++) { char s[10]; scanf("%s", s); if (s[0] == 'G') { int temp; scanf("%d", &temp); if (father[temp] == temp) { if (minn[temp] != inf) printf("Lowest rate: %d.\n", minn[temp]); else printf("Company %d is empty.\n", temp); } else { int belong = Find(temp); printf("Company %d is a part of company %d.\n", temp, belong); } } else if (s[0] == 'M') { int x, y; scanf("%d %d", &x, &y); if (x == y) { puts("Reject"); continue; } if (father[x] == x && father[y] == y) { father[y] = x; minn[x] = min(minn[x], minn[y]); puts("Accept"); } else puts("Reject"); } else if (s[0] == 'A') { int val, belong; scanf("%d %d", &val, &belong); if (father[belong] != belong) { puts("Reject"); continue; } minn[belong] = min(minn[belong], val); puts("Accept"); } } printf("\n"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人