POJ1082食物链
加权并查集入门习题。
传送门http://poj.org/problem?id=1182
下面来记录一下做法:
并查集的作用是询问两个对象时候在同一集合以及将两个非空不相交集合合并。
本题涉及两点之间是否能够两边,这样就可以生成多个集合。
而d=1 ,d=2则相当于将两个集合检索,若合法则合并,否则则将ans++。
但在检索时,我们发现采用一般的并查集无法实现(开三个除外),因为无法简单的利用两点是否在同一集合而判断是否可行。
故想到将其附加信息,而加权并查集的信息一般处理为儿子对父节点的关系或父节点对儿子的关系。
本题设rec[i]为i节点对fa[i]的关系。
如果通过a->b ,b->c能求出a->c,那么本题就变得十分简单。
通过枚举可以发现
令0表示同类,1表示被父节点吃,2表示吃父节点。
这样在求a->c 时,就可以用(rec[i]+rec[fa[i]])%3来表示。
下面上代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "cctype"
using namespace std;
const int maxn = ;
int n ,k ,fa[maxn] ,rec[maxn];
void read(int &x)
{
x = ;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c))
{
x = (x<<) + (x<<) + c - '';
c = getchar();
}
return ;
} int find_(int x)
{
if(x == fa[x]) return x;
int temp = fa[x];
fa[x] = find_(fa[x]);
rec[x] = (rec[temp]+rec[x])%;
return fa[x];
} int Union(int x ,int y ,int d)
{
int f1 = find_(x) ,f2 = find_(y);
if(f1 == f2)
{
if(d == )
{
if(rec[x] == rec[y])
return ;
else return ;
}
if(d == && rec[x] != (rec[y] + )%)
return ;
return ;
}
else
{
fa[f2] = f1;
rec[f2] = (rec[x] + (d-) + (-rec[y])) % ;
}
return ;
} int main()
{
read(n); read(k);
int num1 ,num2 ,num3 ,ans = ;
for(int i=; i<=n; i++) fa[i] = i ,rec[i] = ;
for(int i=; i<=k; i++)
{
read(num1);
read(num2);
read(num3);
if(num2>n || num3>n)
{
++ans;
continue;
}
if(num1 == && num2 == num3)
{
++ans;
continue;
}
ans += Union(num2 ,num3 ,num1);
}
printf("%d" ,ans);
}
POJ1082食物链的更多相关文章
- 关押罪犯 and 食物链(并查集)
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- tyvj1202 数数食物链
描述 TsyD学习了生物的生态环境那一张后,老师留了一项作业,就是给一张食物网,求所有食物链的总数.(从最低营养级生物(它不能吃任何其他的生物)开始到最高营养级(它不能被任何其他生物吃) 叫做一条食物 ...
- vijos1531 食物链
背景 安徽省芜湖市第二十七中学测试题 NOI 2001 食物链(eat) Description:OfficialData:OfficialProgram:JackDavid127 描述 动物王国中有 ...
- poj1182食物链_并查集_挑战程序设计竞赛例题
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65534 Accepted: 19321 Description ...
- BZOJ4562: [Haoi2016]食物链
Description 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动关系,求其中的食物链条数. 物种的名称为从1到n编号 M条能量流动关系形如 a1 b1 a2 ...
- [poj1182]食物链(并查集+补集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64841 Accepted: 19077 Description ...
- [并查集] POJ 1182 食物链
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 66294 Accepted: 19539 Description ...
- 【BZOJ-4562】食物链 记忆化搜索(拓扑序 + DP)
4562: [Haoi2016]食物链 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 133 Solved: 112[Submit][Status] ...
随机推荐
- DevOps之负载均衡
唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <负载均衡LB(Load Balance)> 关于负载均衡器:知识与技能的层次(知 ...
- TCP/IP四层模型与OSI参考模型
TCP/IP四层模型: 1.链路层(数据链路层/网络接口层):包括操作系统中的设备驱动程序.计算机中对应的网络接口卡 2.网络层(互联网层):处理分组在网络中的活动,比如分组的选路. 3.运输层:主要 ...
- WPF 快捷键读写txt
因为git提交需要写这次做的,所以我想弄个东西来帮我写 WPF可以使用快捷键,快捷键主要使用InputBindings,WPF读写文件很简单 我每次都要写 第一句标题 之后就是我写的修改 然后加上我名 ...
- UWP appButtonBar样式
UWP 的appButtonBar使用<AppBarButton Icon = "Next" Label = "Next" /> Icon是 Sym ...
- 线程queue
import queue q = queue.Queue() #模拟队列,先进先出 q.put('first') q.put('second') q.put('third') print(q.get( ...
- 企业微信开发之向员工付款(C#)
一.企业微信API 地址:http://work.weixin.qq.com/api/doc#11545 二.参数说明 1.向员工付款 请求方式:POST(HTTPS)请求地址:https://api ...
- Git相关操作一
1.将目录变为Git项目: 输入git init将当期目录变为Git项目 git init git项目可以被认为分为三个区域,Working Directory,Staging Area,Reposi ...
- MySQL分区表与合并表
一.分区表 1. 什么是分区表? 对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成(所以索引也是按照分区的子表定义的, 而没有全局索引).实现分区的代码实际上是对一组底层表的句柄对象的 ...
- 读书笔记-你不知道的JS中-promise(3)
坑坑坑 关于术语:决议.完成以及拒绝. 首先观察Promise(..)构造器: var p = new Promise(function(x, y) { //x() 用于完成 //y() 用于拒绝 } ...
- JSON.stringify实战用法
1.首先定义一个数组 var teamPlanMinList = new Array(); 2. 定义一个json对象 var json = { "plname":plname, ...