首页 > 其他分享 >poj 1182 食物链 并查集

poj 1182 食物链 并查集

时间:2023-07-11 16:31:42浏览次数:47  
标签:食物链 Nk int 假话 查集 1182 动物 poj include


食物链
Time Limit: 1000MS
Memory Limit: 10000K
Total Submissions: 56297
Accepted: 16500
Description
动物王国中有三类动物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 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
Sample Output
3
Source
Noi 01
经典题,,好好看看,不是彻底弄懂

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N  50005
#define Nk  100005
int p[3*N],r[3*N],par[3*N],t[Nk],x[Nk],y[Nk];
void init(int n)
{
    for(int i=0;i<=3*n;i++)
    {
        par[i]=i;
        r[i]=1;
    }
}
int find(int x)
{
    if(x!=par[x])
        par[x]=find(par[x]);
    return par[x];
}
int same(int x,int y)
{
    return find(x)==find(y);
}
int unit(int x,int y)
{
    int rx=find(x);
    int ry=find(y);
    if(rx==ry)
        return 0;
    if(r[rx]<r[ry])
        par[rx]=ry;
    else
    {
        par[ry]=rx;
        if(r[rx]==r[ry])
            r[rx]++;
    }
}
int solve(int n,int k)
{
     int ans=0;
     for(int i=1;i<=k;i++)
            {
              scanf("%d %d %d",&t[i],&x[i],&y[i]);
              if(x[i]>n||y[i]>n||x[i]<1||y[i]<1)
              {
                  ans++;
                  continue;
              }
              int rx=x[i];
              int ry=y[i];
              if(t[i]==1)
              {
                  if(same(rx,ry+n)||same(rx,ry+2*n))
                        ans++;
                  else
                  {
                      unit(rx,ry);
                      unit(rx+n,ry+n);
                      unit(rx+2*n,ry+2*n);
                  }
              }
              else if(t[i]==2)
              {
                  if(same(rx,ry)||same(rx,ry+2*n))
                      ans++;
                  else{
                  unit(rx,ry+n);
                  unit(rx+n,ry+2*n);
                  unit(rx+2*n,ry);
                  }
              }
            }
     printf("%d\n",ans);
}
int main()
{
    int n,k;
    scanf("%d %d",&n,&k);//不能写成while
    init(n);
    solve(n,k);
    return 0;
}


标签:食物链,Nk,int,假话,查集,1182,动物,poj,include
From: https://blog.51cto.com/u_16185524/6689494

相关文章

  • 【模板】并查集
    简介并查集是什么并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集其实就是一个树,如果要合并的话就将其中一个的根节点连接到另外一个的根......
  • P2024 [NOI2001] 食物链 || #576. 食物链【NOI2001】 (并查集)
    空降锣鼓空降OJ题解:#include<bits/stdc++.h>usingnamespacestd;intn,k;intd,x,y;intans;intfa[500050];intfind(intx){//找爸爸 if(fa[x]==x) returnfa[x]; returnfind(fa[x]);}intmain(){ cin>>n>>k; for(inti=1;i<=n*3;i++)//开三个并查集风......
  • Cesium学习笔记3——加载topojson和Geojson
    在根目录下新建bucket.css@import"../Build/CesiumUnminified/Widgets/widgets.css";@import"../Build/CesiumUnminified/Widgets/lighter.css";html{height:100%}body{background:#000;color:#eee;font-family:sans-serif;font-size:9pt;padding:0;margin:0;w......
  • #570. 【例4-8】格子游戏 (并查集)
    #570.【例4-8】格子游戏题题题题题题题题题题题题题题分析:并查集解决的是连通性(无向图连通分量)和传递性(家谱关系)问题,并且可以动态的维护。抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以将点分为若干个集合,每个集合对应图中的一个连通块......
  • 并查集学习笔记
    什么是并查集顾名思义,并查集有两个最主要的作用:合并集合和查询某两个元素是不是在同一个集合内。或者说:并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个......
  • POJ 2976:Dropping tests 01 分数规划
    DroppingtestsTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 12291 Accepted: 4293DescriptionInacertaincourse,youtake n tests.Ifyouget ai outof bi questionscorrectontest i,yourcumulativeaverageisdefinedtobe.Gi......
  • 可删除的并查集
       当并查集要删除某一个节点时,不能直接修改该节点的根节点p[i]=i,如果这个节点不是叶子节点,会导致子树的根节点改变。而要删除单独一个非叶子节点,普通的并查集不好操作。可以在初始化并查集时将每一个节点都当作一个树,给每一个节点创建一个虚构的根节点,进行加边操作时只修......
  • 【线段树】 POJ 3667 Hotel
    这道题和那道HDOJ3308LCIS比较像。。那道题目我就写了超久,当时是不确定保存什么信息。。这道题也写了很久,主要是各种低级错误,找错找了很久,超级火。。。。#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<queue>#include<stack>#inc......
  • 【树状数组】 POJ 2155 Matrix
    水水的二维树状数组,代码写搓了,找了好久的错。。。#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cst......
  • 【并查集】 HDOJ 4786 Fibonacci Tree
    就是求出搞成最小生成树的最少白边和最多白边的数量。。。。#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cstdio>#include<algorithm>#include<cstring>#include<......