POJ1182 - 食物链(带权并查集)

【并查集】POJ 1182 食物链 POJ 1182 : 食物链 由于题目中的N个动物都是A,B,C三类中的其中一种。题目有两种操作方式,【1】”1 X Y”,表示X和Y是同类,这个操作就是并查集中的【并】操作,【2】”2 X Y”,表示X吃Y,这个操作实际上是维护了森林中树之间的关系(类似有向图,此时树类比成一个顶点)。题目求这两个操作不成功的个数,假设为ans。 问题拆分 【1】进行1 X Y表示X和Y是同类... 阅读详情

题目链接:

http://poj.org/problem?id=1182


题目大意:

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这N个动物所构成的食物链关系进行描述:
第一种说法是”1 X Y”,表示X和Y是同类。
第二种说法是”2 X Y”,表示X吃Y。
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
1) 当前的话与前面的某些真的话冲突,就是假话;
2) 当前的话中X或Y比N大,就是假话;
3) 当前的话表示X吃X,就是假话。
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。


解题过程:

这题主要是看的书和博客,之前没接触过带权并查集。


题目分析:

这题用两种做法做了下,一种是挑战程序设计竞赛中的,另一种是搜的博客上面的。

首先说下简单粗暴的第一种方法:

一:

这里写图片描述

二:

对于每个节点有一个 Rank数组表示权值,这里引用两个blog好了:
http://blog.youkuaiyun.com/qq_24451605/article/details/46876121
http://blog.youkuaiyun.com/c0de4fun/article/details/7318642/


AC代码一:

#include<cstdio>
using namespace std;

const int MAX = 1123456;

int N, K;

int f[MAX];

int root(int t) {
    if (f[t] == t)
        return t;
    else
        return f[t] = root(f[t]);
}

int connect(int a, int b) {
    int fa = root(a);
    int fb = root(b);
    f[fa] = fb;
}

int same(int a, int b) {
    return root(a) == root(b);
}

void init() {
    for (int i = 0; i <= N*3; i++)
        f[i] = i;
}


int main() {
    int ans = 0;
    scanf("%d %d", &N, &K);
    init();
    for (int i = 0; i < K; i++) {
        int D, X, Y;
        scanf("%d %d %d", &D, &X, &Y);
        if (X > N || X < 1 || Y < 1 || Y > N) {
            ans++;
            continue;
        }
        else if (D == 1) {
            if (same(X, Y+N) || same(X, Y+N*2)) {
                ans++;
                continue;
            }
            connect(X, Y);
            connect(X+N, Y+N);
            connect(X+N*2, Y+N*2);
        }
        else {
            if (same(X, Y) || same(X, Y+N*2)) {
                ans++;
                continue;
            }
            connect(X, Y+N);
            connect(X+N, Y+N*2);
            connect(X+N*2, Y);
        }
    }
    printf("%d\n", ans);
}

AC代码二:

#include<cstdio>
using namespace std;

const int MAX = 112345;

int ran[MAX], f[MAX];
int N, K;


void init() {
    for (int i = 0; i <= N; i++)
        f[i] = i, ran[i] = 0;
}

int root(int x) {
    if (x == f[x])
        return x;
    int temp = f[x];
    f[x] = root(f[x]);
    ran[x] = (ran[x] + ran[temp])%3;
    return f[x];
}

void connect(int a, int b, int type) {
    int fa = root(a);
    int fb = root(b);
    if (fa == fb)
        return;
    f[fa] = fb;
    ran[fa] = (type+ran[b]-ran[a]+3)%3;
}

bool check(int a, int b, int type) {
    if (a > N || b > N)
        return false;
    if (type == 1 && a == b)
        return false;
    if (root(a) == root(b))
        return (ran[a]-ran[b]+3)%3 == type;
    else
        return true;
}

int main() {
    int ans = 0;
    scanf("%d %d", &N, &K);
    init();
    while (K--) {
        int D, X, Y;
        scanf("%d %d %d", &D, &X, &Y);
        D--;
        if (check(X, Y, D))
            connect(X, Y, D);
        else
            ans++;
    }
    printf("%d\n", ans);
}
poj1182:食物链 题解 poj1182:食物链 听说是poj中最经典的一道并查集题目。我一做,果然很经典呢!好难啊!!!真的琢磨了很久才弄懂。这道题的重点就在于怎么用并查集表示题目中的关系环。 1. 题干 原题传送门1 原题传送门2 2. 思路详解 实际上,在做这道题之前,我对并查集的了解就只停留在权重选择和压缩路径上。也就是大家司空见惯的那种模板。顺带再默写一遍复习一下: #include <vector> using namespace std; class unionfind { public: 阅读详情

相关推荐

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了如何使用FModel工具从UE5游戏的.pak文件中提取3D模型,并提供了Dumper-7的避坑指南。内容涵盖FModel工具链配置、UE5特有的unversioned properties问题解决方案、Dumper-7实战流程以及模型后处理技巧,帮助开发者高效获取游戏资产。

weixin_30872499的博客 424

POJ - 1182: 食物链 (并查集)

题目链接:http://poj.org/problem?id=1182 题目大意: 中文题目,自己看就好 解题思路:并查集经典中的经典题,在网上看了很多大牛的思路,大部分是增加一个结构体存动物间的关系,结合并查集判断,但是关系域的更新比较复杂,一下子不太容易理解,这里推荐一个大牛的解题思路,讲解得非常清楚:https://blog.csdn.net/niushuai666/article/de...

Jerry的博客 8106

高频功率放大器的设计实现

摘 要 随着无线通信技术的高速发展,市场对射频电路的需求越来越大,同时对射频电路的性能要求也越来越高。高频功率放大器是位于无线发射级末端的重要部件,为了弥补信号在无线传输过程中的衰耗,要求发射机具有较大功率的输出,通信距离越远,要求的输出功率越大。在高频范围内,为了获得足够大的高频输出功率,就要采用高频功率放大器。 本次课程设计的高频功率放大器的技术指标包括输出功率、效率、功率增益、由于高频频功率放大器的输出功率比较大,耗能比较多,所以工作效率就显得比较重要。本课程设计的高频功率放大器电路由两极功率放大器

qq_43543515的博客 3万+

POJ 1182:食物链 ← 种类并查集 快读

【问题描述】 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 1)当前的话与前

hnjzsyjyj的专栏 365

从分立到集成:深入解析Buck电路的核心模块与设计权衡

本文深入解析Buck电路的核心模块与设计权衡,从分立到集成方案的优缺点对比。详细探讨Buck电路的高效能量转换、小型化设计及灵活电压调节能力,并结合实际案例分享分立方案中的PWM生成、反馈环路设计及保护电路优化经验,为工程师提供实用设计参考。

weixin_29306317的博客 225

【Pandas总结】第二节 Pandas 的数据读取_pd.read_csv()的使用详解(非常全面,推荐收藏)

pandas对纯文本的读取提供了非常强力的支持,参数有四五十个。这些参数中,有的很容易被忽略,但是在实际工作中却用处很大。

weixin_47139649的博客 11万+

【POJ No. 1182】 食物链

【POJ No. 1182】 食物链

代码改变世界 702

POJ 1182 食物链(带权并查集)

POJ 1182 食物链(带权并查集) 前几天在叶某同学的忽悠下,做了这道挺有意思的题目,感觉这道有必要做下记录。刚开始想到大概是绕一个圈子来证明之前的关系是否与当前语句给出关系矛盾,若矛盾,则是假话(就是后来看别人博客的向量的方法,但是我只是有感觉,具体写不出,所以参考了下这位大神的博客:http://hi.baidu.com/tomspirit/item/d1f2a19b2aaf36d27...

wu2588的专栏 490

Flow Matching05:概率路径与插值【概率路径:线性插值路径(最简单)、高斯插值路径】【先尝试线性插值,看效果如何;若不够好,尝试高斯插值】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 174

30天入门 SAP BTP 开发系列之四:SAP BTP 控制台里 Global Account 的常规操作介绍

笔者前一篇文章,介绍了 SAP BTP 中 Global Account 的概念。本文咱们一起来看看 SAP BTP 控制台里,给 Global Account 开放了哪些操作功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 870

(带权并查集)POJ1182 食物链

POJ1182 食物链 思路: 因为题目给的相对关系,所以可以用带权并查集做。 权值:0表示x和y是同类,1表示x吃y,2表示x被y吃。 那么在路径压缩的时候,我们得到w[a->c]=(w[a->b]+w[b->c])%3。在区间合并的时候w[t1]=(-w[x]+w[y]+w-1)%3。在判断关系的时候比较w-1和(w[x]-w[y]+3)%3,+3是为了避免负数,w-1是因为...

Z7784562的博客 194

强化学习:在智能交通系统中的应用

作者:禅与计算机程序设计艺术 这篇文章将探索如何利用强化学习(RL)这一强大的机器学习方法,在智能交通系统中实现自动驾驶、优化路线规划和提高道路安全等方面的突破。RL通过让智能体与环境互动并从这些互动中学习,从而解决复杂的决策过程问题,这正是现代智能交通系统所需要的。 背景介绍 随着城市化进程的加速,交通拥堵、能源消耗和交通事

AI天才研究院 1121

POJ 1182 食物链 【带权并查集 (种类并查集)】

HDU 3038 How Many Answers Are Wrong 比较经典的带权并查集,能让你真正理解带权并查集: 诠释是这样的:在对并查集进行路径压缩和合并操作时,这些权值具有一定属性,即可将他们与父节点的关系,变化为与所在树的根结点关系。也就是说,权值代表着当前节点与父节点的某种关系(即使路径压缩了也是这样),通过两者关系,也可以将同一棵树下两个节点的关系表示出来。 具体思路: 话不...

指弹键盘哼民谣 506

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

E - 食物链 POJ - 1182(带权并查集,有图解)

E - 食物链 POJ - 1182(带权并查集) 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N...

石旭先森的博客 367

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj 1182 食物链(带权并查集)

题目链接:poj 1182 食物链 题目大意:略。 解题思路:带权并查集的裸体,每个点除了记录前一个点以外,再多记录下和前一个点的关系。 #include #include const int N = 1e5+5; int n, k, f[N], v[N]; int getfar(int x) { if (x != f[x]) { int tmp =

不慌不忙、不急不躁 1111

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【POJ】1182 - 食物链(带权并查集,单数据)

食物链 Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit Status Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。  现有N个动物,以1-

wyg1997 1346

POJ1182 食物链 (带权并查集)

POJ1182 食物链 (带权并查集)   一看见这道题就想到了并查集,但是普通的并查集根本行不通,因为通过普通的并查集我们只能得出两个元素是否在同一个集合与把两个集合合并为一个集合,这道题既有种类之分,各个种类之间还有同类、吃、被吃的关系。限时训练结束后学长说这道题用带权并查集,百度了n个博客,才有了点头绪。   首先,带权并差集比普通的并查集多了一个权值(关系),普通并查集只用了一个pre数组...

GYH0730的博客 541

POJ 1182 食物链(带权并查集)

题目链接:POJ 1182 食物链 没学带权并查集时候做过一次这个题,当时没做出来,kanletiji

fobdddf的专栏 1036

POJ1182 -- 食物链 (带权并查集经典例题)

POJ1182 – 食物链 (带权并查集经典例题) 【题目链接】 题目 食物链 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是”1...

xuziling_的博客 293

POJ ~ 1182 ~ 食物链 (带权并查集)

参考博客:POJ-1182 食物链思路:经典的带权并查集。除了并查集那个数组外,多开一个权值数组,或者把两个合成一个结构体数组。权值为每个点与根节点的关系//0:同类 1:吃 2:被吃。图一:路径压缩 图二:合并操作图三:a和b相对关系//#include #include #include using namespace std; const int MAXN = 50005; int n, m

张松超的博客 424

Poj 1182 食物链 —— 带权并查集

This way 题意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接...

天翼之城的博客 363

【带权并查集】POJ1182 [NOI2001]食物链

题面在这里这是一道经典的带权并查集例题。 我们定义权值s[i]表示节点i与根的关系: 0:和根是同一种动物 1:i能够吃根节点 2:i被根节点吃 这样定义的好处就是,在模3的意义下,各个节点之间的关系能够传递 (接下来本题解所讨论的范围都是在模3的意义下) 例如: 这样我们的权值s[i]就能满足一维向量加法了。那么很显然,s[i]也满足一维向量减法: a与b的关系就是s[a

linkfqy 1639
上一篇: ZOJ3777 - Problem Arrangement(状压DP)
下一篇: POJ3169 - Layout (差分约束)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值