E - 食物链 POJ - 1182

题目大意:

       唔。。是个中文题,就不用解释了哈 ~

解题思路:

      其实不用纠结搞懂谁是A,谁是B,谁是C。对于每一种动物,都创建三个角色: i - A,i - B,i - C。分别用0~N,N+1~2N,2N+1~3N 表示。

      然后对于比如“1 4 6”的情况,就把 4 和 6 连起来,把 4+N 和 6+N 连起来,把4+2N 和6+2N 连起来,连接之前,检查原来的关系;对于“2 4 6”的情况,把 4和6+N,4+N和6+2N,4+2N和6 连起来 ,也要检查一下以前的关系。(如果以前的关系跟现在的关系是反的,就不对,检查比如x - A和y-B或者y-C是否在同一组)

参考代码:

    (以后还是不要用cin cout了,这里用cin cout 结果TLE,然后改了scanf ,printf就过了。。。)

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;

const int INF=0x3f3f3f3f;
const int SIZE=50005;

int id[SIZE*4];
int n,m;

int find(int x)
{
    if(x!=id[x]) id[x]=find(id[x]);
        return id[x];
}
void un(int p,int q)
{
    p=find(p);q=find(q);id[p]=q;
}
bool same(int x,int y)
{
    return find(x)==find(y);
}

int main()
{
    int n,m;
    int a,b,c;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n*3;i++)
        id[i]=i;
    int sum=0;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(b>n||c>n) {sum++;continue;}
        if(a==1)
        {
            if(same(b,c+n)||same(b,c+n*2))
                sum++;
            else
            {
                un(b,c);
                un(b+n,c+n);
                un(b+n*2,c+n*2);
            }
        }
        else
        {
            if(same(b,c)||same(b,c+2*n))
                sum++;
            else
            {
                un(b,c+n);
                un(b+n,c+n*2);
                un(b+n*2,c);
            }
        }
    }
    printf("%d\n",sum);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值