HDU 2860 (并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2860

题目大意:新兵入伍。三种操作:①入伍②合并队伍③查找一个队伍里面战斗力最弱的。注意队伍编号从0开始。

解题思路

单看入伍的话,很容易想到以士兵为单位建立并查集。

然而到了合并队伍、查询的时候,就没办法了。

更直接的,以队伍为单位建立并查集,这样只要$f[x]!=x$,说明队伍已被合并。

当然,最重要的,就是查询之前,没必要路径压缩,因为只需要简单判断$f[x]!=x$,而不是查f[x]的具体值。

同时用cap数组维护每个队伍的最弱战斗力。

维护

①入伍时候,先Judge $f[x]!=x$。

若存在,此时只需Min更新一下队伍的战斗力就可以。

②合并队伍,先Judge $f[x]==x$&&$f[y]==y$&&$x!=y$,直接令$f[y]=x$,并且更新,不需要路径压缩。

反之,拒绝合并。

查询

①成功输出的条件是:$f[x]==x$&&$cap[x]!=inf$

②空队伍的条件是:$f[x]==x$&&$cap[x]==inf$ (注意,转移之后,就算是空队伍,也在③中处理)

③转移队伍的条件是:$f[x]!=x$ ,查询时候,再find路径压缩即可。

代码

#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
int f[maxn],cap[maxn];
int find(int x) {return x!=f[x]?f[x]=find(f[x]):x;}
int main()
{
    //freopen("in.txt","r",stdin);
    int n,k,m,R,C;
    while(scanf("%d%d%d",&n,&k,&m)!=EOF)
    {
        for(int i=0;i<=n;i++) f[i]=i;
        memset(cap,inf,sizeof(cap));
        for(int i=1;i<=k;i++)
        {
            scanf("%d%d",&R,&C);
            cap[C]=min(cap[C],R);
        }
        char cmd[5];
        for(int i=1;i<=m;i++)
        {
            scanf("%s",&cmd);
            if(cmd[0]==‘A‘)
            {
                scanf("%d%d",&R,&C);
                if(f[C]!=C) {printf("Reject\n");continue;}
                cap[C]=min(cap[C],R);
                printf("Accept\n");
            }
            if(cmd[0]==‘M‘)
            {
                scanf("%d%d",&R,&C);
                if(f[R]==R&&f[C]==C&&R!=C) {f[C]=R;cap[R]=min(cap[R],cap[C]);printf("Accept\n");}
                else printf("Reject\n");
            }
            if(cmd[0]==‘G‘)
            {
                scanf("%d",&R);
                if(f[R]==R&&cap[R]!=inf) printf("Lowest rate: %d.\n",cap[R]);
                else if(f[R]==R&&cap[R]==inf) printf("Company %d is empty.\n",R);
                else if(f[R]!=R) printf("Company %d is a part of company %d.\n",R,find(R));
            }
        }
        printf("\n");
    }
}
时间: 2024-11-17 07:31:30

HDU 2860 (并查集)的相关文章

HDU 1051 并查集+贪心

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11694    Accepted Submission(s): 4837 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 1512 并查集+左偏树

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3105    Accepted Submission(s): 1330 Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they e

hdu 1829 并查集(食物链的弱化版)

http://acm.hdu.edu.cn/showproblem.php?pid=1829 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of

hdu 4514 并查集+树形dp

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4539    Accepted Submission(s): 816 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,

hdu 1856 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 13672    Accepted Submission(s): 5008 Problem Description Mr Wang wants some boys

HDU 1181 并查集 or SPFA

变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 12773    Accepted Submission(s): 4733 Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规

hdu 1213 并查集入门

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12538    Accepted Submission(s): 6145 Problem Description Today is Ignatius' b

HDU 3938 并查集

求小于L的路径点对数(路上的最大值),按权值排序,从小到大并查集建图,有点kruskal的意思. /** @Date : 2017-09-22 17:30:11 * @FileName: HDU 3938 并查集 离线.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h>

HDU 1829 并查集

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8224    Accepted Submission(s): 2631 Problem Description Background Professor Hopper is researching the sexual behavior of a rare sp