又见关系并查集 以POJ 1182 食物链为例
简单的关系并查集一般非常easy依据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离。
对于此题:
若u。v不在一个集合内,则显然此条语句会合法(暂且忽略后两条。下同)。
那么将fu 变为 fv的儿子时需加一条权值为 w 的边,w 满足(w + ru)%3 = (rv+ (D == 1?
0 : 1))%3(ru。rv分别为u,v与fv的关系,即距离)。
之所以在D == 2时加 1。是由于u吃v表明着u到fv的距离比v到fv的距离大1。
同理。D == 1时,表明两者到fv的距离应该相等。
若u,v在一个集合内。仅仅须要推断ru%3 == (rv+(D == 1?):1))%3 是否成马上可。
只是这个题数据略坑啊。写成多组输入的根本过不了。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define INF 0x3f3f3f3f using namespace std; struct N
{
int fa,re;
} st[50010]; int Find(int x,int &R)
{
int f,re = 0; f = x; while(f != st[f].fa)
{
re = (re+st[f].re)%3;
f = st[f].fa;
} R = re;
int tre = 0,temp,tf; while(x != st[x].fa)
{
tf = st[x].fa;
temp = st[x].re; st[x].re = (re-tre+3)%3; tre = (tre+temp)%3;
st[x].fa = f;
x = tf;
} return f;
} bool Merge(int w,int u,int v)
{
int ru,rv;
int fu = Find(u,ru);
int fv = Find(v,rv); if(fu != fv)
{
st[fu].fa = fv;
if(w == 2)
st[fu].re = ((rv+1)%3 - ru + 3)%3;
else
st[fu].re = (rv%3- ru + 3)%3;
}
else
{
if(w == 1 && ru != rv)
return false; if(w == 2 && ru != (rv+1)%3 )
return false;
} return true;
} int main()
{
int n,k; int i,j,u,v,w; scanf("%d %d",&n,&k);
{
for(i = 1; i <= n; ++i)
st[i].fa = i,st[i].re = 0; int ans = 0; while(k--)
{
scanf("%d %d %d",&w,&u,&v); if(u > n || v > n || (w == 2 && u == v))
{
ans++;
continue;
} if(Merge(w,u,v) == false)
{
ans++;
}
} printf("%d\n",ans);
} return 0;
}
又见关系并查集 以POJ 1182 食物链为例的更多相关文章
- 并查集:POJ 1182 食物链 复习
#include <iostream> #include <algorithm> #include <cstring> #include <cstdlib&g ...
- poj 1182 食物链 (带关系的并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...
- poj 2492(关系并查集) 同性恋
题目;http://poj.org/problem?id=2492 卧槽很前卫的题意啊,感觉节操都碎了, t组测试数据,然后n,m,n条虫子,然后m行,每行两个数代表a和b有性行为(默认既然能这样就代 ...
- poj 1182 (关系并查集) 食物链
题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...
- poj 1182 食物链(关系并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62824 Accepted: 18432 Description ...
- Find them, Catch them(POJ 1703 关系并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38668 Accepted: ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- [并查集] POJ 1182 食物链
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 66294 Accepted: 19539 Description ...
- POJ 1182 食物链(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63592 Accepted: 18670 Description ...
随机推荐
- Spring 7大功能模块的作用
1. Spring 7大功能模块的作用 1) 核心容器(Spring core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系 ...
- ASP.NET-internat身份验证
ASP.NET-internat身份验证默认在webconfig中配置的代码是这样的 <system.web> <compilation debug="true" ...
- spring mvc常用知识点总结
1.spring mvc是靠spring 启动的.通过springjar包的org.springframework.web.servlet.DispatcherServlet这个servlet类具体启 ...
- HDU 4318 Contest 2
简单的一题,使用类DIJK的算法就可以了. #include <iostream> #include <cstdio> #include <queue> #incl ...
- hdu1281 棋盘游戏 --- 最大匹配
给一个矩形棋盘,上面有一些空格点,能够放象棋中的"车", 现给出空格的坐标,求最多能够放多少个"车"使他们互不攻击(依据象棋规则,每行每列至多仅仅能放一个), ...
- Chisel实验笔记(四)
在<Chisel实验笔记(二)>中.通过编写TestBench文件,然后使用Icarus Verilog.GtkWave能够測试,查看相关波形.比較直观,在<Chisel实验笔记(三 ...
- UVALive 4223 / HDU 2962 spfa + 二分
Trucking Problem Description A certain local trucking company would like to transport some goods on ...
- bzoj5106: [CodePlus2017]汀博尔(二分答案)
5106: [CodePlus2017]汀博尔 题目:传送门 题解: 百题纪念!!! 原谅一下第一百题刷了到水题... 直接二分月份然后判断(注意上界大小) 代码: #include<cstdi ...
- pjlib深入剖析和使用详解
1. PJSIP简介 PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.其主要特征包括: 1).极具移植性.(Extremely portable) ...
- javascript系列-Class1.JavaScript基础
欢迎加入前端交流群来py:749539640 转载请标明出处! JavaScript概述 一个页面分成三个部分,结构,样式,行为. HTML代表了页面的结 ...