[kuangbin带你飞]专题五 并查集

[kuangbin带你飞]专题五 并查集

写作风格

⭐️表示我觉得有些难,还没怎么透

❤️表示这是好题呀。可能是贴近实际生活的背景,可能是解法真是妙。​

学习带权并查集原理

A. poj-2236

Wireless Network

题意:

有N台坏电脑的坐标,O x表示修复第x台电脑,S p q询问p和q这两台电脑能不能交流,交流的条件是,首先2台电脑得已经都被修复了,其次是p和q覆盖的网之间的距离不能超过d。

题解:

每次修好一台电脑就扫描所有点,以加入所有距离小于1的集合圈子内。不能只加一个,因为它可能是2个集合的连接点。

B.poj-1611 并查集模板题

The Suspects

题意:

有n个学生,m个聚会,给出每场聚会参加的人的号码,0号学生得了传染病SARS,问有几个人被传染得了SARS。

题解:

把每次聚会的人都做成一个并查集,最后对每个人看一遍是否和0号同学的祖宗相同。

C.hdu-1213 并查集裸题

#include "cstdio"
using namespace std;
int n,m;
const int maxn=3e4+10;
int fa[maxn],sure[maxn];
int anc(int a)
{
    if(fa[a]==a)return  a;
    return  fa[a]=anc(fa[a]);
}
void connect(int a,int b)
{
    int faa=anc(fa[a]);
    int fab=anc(fa[b]);
    fa[faa]=fab;
}
void  init(int n)
{
    for(int i=0;i<=n;++i)
    {
        fa[i]=i;
    }
}
int have[maxn];
int main(void)
{
   //freopen("in.text","r",stdin);
     int cas;
     scanf("%d",&cas);
     while (cas--)
     {
         scanf("%d %d",&n,&m);
         init(n);
         for(int i=1;i<=m;++i)
         {
             int a,b;
             scanf("%d %d",&a,&b);
             connect(a,b);
         }
         int ans=0,suc;
         for(int d=1;d<=n;++d)
         {
             suc=0;
            for(int i=1;i<=ans;++i)
                if(have[i]==anc(d))
                {   suc=1;
                    break;}
            if(!suc)have[++ans]=anc(d);

         }
        printf("%d\n",ans);
     }
    return  0;
}

E. poj-1182 ⭐️

题解: 带权并查集好题

F. poj-1417 ❤️ 并查集01模型+背包dp

True Liars

题意:

有n次对话,p1个好人,p2个坏人,问x2是一个好人吗,x1会回答yes或者no,如果x1是一个坏人他会说谎话,如果它是好人,他会说真话。

如果没有确切的证据找出这p1和p2个人,那么就写no。否则就按大小顺序输出。

题解:
x 1 是 天 使 { x 2 是 天 使 说 y e s x 2 是 恶 魔 说 n o x1是天使\begin{cases} x2是天使&说yes\\ x2是恶魔&说no\\ \end{cases} x1使{x2使x2yesno

x 1 是 恶 魔 { x 2 是 恶 魔 说 y e s x 2 是 天 使 说 n o x1是恶魔\begin{cases} x2是恶魔&说yes\\ x2是天使&说no\\ \end{cases} x1{x2x2使yesno

由上分析知道说yes时两个人同属性,说no时不同属性。

故而做成并查集,有相关性的人会被放到同个集合内,而集合内有2种属性,即是否和根节点相同属性。

这时候就转化成另一个问题了,有(p1+p2)个数,其中有p1个A和p2个B,每组数里面有2种属性的人,各知道人数,但不知道是A还是B。

G.poj-1456

题意:

超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润.

题解

dp+并查集替链表||优先队列

H.poj-1733 ❤️ 并查集妙用

题意:

有n个位置,有m句话说(a,b)范围内1的个数是奇数还是偶数。问第几句话开始出错。

题解:

题解见此

wa点:

😠 把答案i-1写在break前面会wa,写在结尾不会wa!!! 💢💢💢

poj-1984 ❤️

题解:

如果不是有限制在第几个条件之后才问这个问题,就可以用最短路算法了。

注意对问的问题要根据在第几个条件得到后去排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Mally呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值