博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1182 食物链 【带权并查集/补集法】
阅读量:7010 次
发布时间:2019-06-28

本文共 2743 字,大约阅读时间需要 9 分钟。

动物王国中有三类动物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),输出假话的总数。 

Input

第一行是两个整数N和K,以一个空格分隔。 
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。 
若D=1,则表示X和Y是同类。 
若D=2,则表示X吃Y。

Output

只有一个整数,表示假话的数目。

Sample Input

100 71 101 1 2 1 22 2 3 2 3 3 1 1 3 2 3 1 1 5 5

Sample Output

3

【洛谷】https://www.luogu.org/problemnew/show/P2024

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define debug() puts("++++")#define gcd(a,b) __gcd(a,b)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define fi first#define se second#define pb push_back#define sqr(x) ((x)*(x))#define ms(a,b) memset(a,b,sizeof(a))#define sz size()#define be begin()#define pu push_up#define pd push_down#define cl clear()#define lowbit(x) -x&x#define all 1,n,1#define rep(i,x,n) for(int i=(x); i<(n); i++)#define in freopen("in.in","r",stdin)#define out freopen("out.out","w",stdout)using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pair
P;const int INF = 0x3f3f3f3f;const LL LNF = 1e18;const int maxn = 1e5 + 20;const int maxm = 1e6 + 10;const double PI = acos(-1.0);const double eps = 1e-8;const int dx[] = {-1,1,0,0,1,1,-1,-1};const int dy[] = { 0,0,1,-1,1,-1,1,-1};int dir[4][2] = { { 0,1},{ 0,-1},{-1,0},{ 1,0}};const int mon[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};const int monn[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int n,m,d,x,y;int fa[maxn*3];inline int read(){ int sum=0; char ch=getchar(); while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') sum=sum*10+ch-48,ch=getchar(); return sum;}int Find(int x){ return fa[x]==x ? x:fa[x]=Find(fa[x]);}void join(int x,int y){ int fx=Find(x); int fy=Find(y); fa[fx]=fy;}int main(){ scanf("%d%d",&n,&m); int ans=0; for(int i=1;i<=3*n;i++) fa[i]=i; for(int i=1;i<=m;i++) { scanf("%d%d%d",&d,&x,&y); if(x>n||y>n){ans++;continue;} if(d==1) { if(Find(x+n)==Find(y) || Find(x+2*n)==Find(y)) {ans++;continue;} join(x,y); join(x+n,y+n); join(x+2*n,y+2*n); } else if(d==2) { if(Find(x)==Find(y) || Find(x+2*n)==Find(y)) {ans++;continue;} join(x,y+2*n); join(x+n,y); join(x+2*n,y+n); } } printf("%d\n",ans); return 0;}/*【题意】略【类型】带权并查集【分析】对于每种生物:设 x 为本身,x+n 为猎物,x+2*n 为天敌【时间复杂度&&优化】【trick】【数据】*/

 

转载于:https://www.cnblogs.com/Roni-i/p/9435266.html

你可能感兴趣的文章
凯立德货车专用导航 应“运”而生
查看>>
光伏组件市场价格战下谁获益?
查看>>
价格血拼战频频上演 光伏业陷入集体焦虑
查看>>
聊天机器人真正的潜力,潜藏在个人金融领域
查看>>
英特尔或推可超频Kaby Lake酷睿i3处理器: 重拾赛扬300A荣光?
查看>>
要想在未来立足 微软等软件公司就必须折本研发硬件
查看>>
个人常用网址集合
查看>>
吉林省将建东北林业大数据中心
查看>>
从互联网到物联网:下一个创新风口到来
查看>>
郭台铭:苹果亚马逊已提供资金 协助富士康收购东芝闪存
查看>>
美40家互联网巨头联合致信特朗普:今后你该这么做
查看>>
记一次磁盘性能测试
查看>>
运营商应对VoIP数据业务是突围之路
查看>>
光伏逆变器竞争格局再重塑?又一条“鲶鱼”出现
查看>>
CYQ.Data 轻量数据访问层(六) 构造数据表
查看>>
超融合的未来发展与使用案例
查看>>
这是数据中心最好的时代,也是最坏的时代
查看>>
QTP使用中的陷阱
查看>>
Cirrus Delaware公司数据中心计划因建设电厂再次受阻
查看>>
前Windows事业部总裁写给CEO和管理者:如何做决策?
查看>>