[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;
}
复制代码

 

posted @   ViKyanite  阅读(242)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
主题色彩