食物链POJ1182总结

作者: 小太阳花儿 | 来源:发表于2017-12-07 18:22 被阅读93次

这道题是用并查集来解。并查集可以高效的查找某个元素是否属于一个集合。
敲代码过程中一次遇到了如下问题:

new 的使用问题

想开辟一块放100个整形变量的空间,我这样写的:

 int *father = new  int(100);

给这个int数组赋值的时候一直报错,觉得自己一定是开辟空间的时候搞错了。
果然,new A(100)的写法是说,把变量的值初始化成100。
想要开辟100个A类型的变量空间,应该这么写:

int *father=new int[100];

按照《挑战程序设计竞赛》思路写出的代码超时

我在看这边书的时候就一直有一个疑问,作者是不是由于原先写惯了C语言,C++里面的cin和cout用着不顺手,所以还特别费事儿的加上#include<cstdio>的头文件,并且输入输出用printf和scanf。
今天我按照这本书的思路写了1182这一题,发现一直超时,把cin改成scanf就AC了,百度了一下发现很多文章讨论它俩性能的差异。得出的结论是,程序设计题尽量用scanf而不是cin。

源代码

#include <iostream>
#include <cstdio>
using namespace std;

class union_find
{
private:
        int* father;
        int* height;
        int n;
public:
    union_find(int n)
    {

        this->n = n;

        father = new int[n];

        height = new int[n];
        for(int i=0;i<n;i++)
        {

            father[i]=i;
            height[i]=0;
        }

    }
    ~union_find()
    {
        delete []father;
        delete []height;
    }
    int _find(int x)
    {
        if(x>=n)
        {

            return 0;
        }
        if(father[x]==x)
        {
            return x;
        }
        else
        {
            return father[x]=(_find(father[x]));
        }
    }
    void unite(int x,int y)
    {
        if(x>=n||y>=n)
        {

            return;
        }
        x = _find(x);
        y = _find(y);
        if(height[x]<height[y])
        {
            father[x]=y;
        }
        else
        {
            father[y]=x;
            if(height[x]==height[y])
            {
                height[x]++;
            }
        }
    }

    bool same(int x,int y)
    {
        return _find(x) == _find(y);
    }

};



int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
   // cin>>n>>k;


    union_find f(n*3);

    int ans=0;

    for(int i=0;i<k;i++)
    {
        int t,x,y;
        //cin>>t>>x>>y;
        scanf("%d%d%d",&t,&x,&y);

        x = x-1;
        y = y-1;

        if(x<0||x>=n||y<0||y>=n)
        {

            ans++;
            continue;
        }
        if(t==1)
        {
            if(f.same(x,y+n)||f.same(x,y+2*n))
            {

                ans++;
                continue;
            }
            else
            {
                f.unite(x,y);
                f.unite(x+n,y+n);
                f.unite(x+2*n,y+2*n);
            }
        }
        else
        {
            if(f.same(x,y)||f.same(y,x+n))
            {
                ans++;
                continue;
            }
            else
            {
                f.unite(x,y+n);
                f.unite(x+n,y+2*n);
                f.unite(x+2*n,y);
            }
        }
    }
    cout<<ans<<endl;
    return ans;
}

相关文章

  • 食物链POJ1182总结

    这道题是用并查集来解。并查集可以高效的查找某个元素是否属于一个集合。敲代码过程中一次遇到了如下问题: new 的使...

  • POJ1182——食物链

    问题描述 有三类动物A,B,C,这三类动物的食物链构成了有趣的环形:A吃B, B吃C,C吃A。 现有N个动物,以1...

  • POJ1182(食物链)

    链接:https://vjudge.net/problem/POJ-1182思路:由于已经确定了只有三种关系并且为...

  • 商业位势决定收益极限

    自然界中有“食物链”,“食物链”中不同的生物处于不同的位置,我们将食物链中的位置称之为营养级。比如青草——昆虫——...

  • 财经快评:处在食物链顶端的公司,吃相不要太难看

    来源|商业创见(ID:Bestpr) 近期财经热点颇多,有点让吃瓜群众应接不暇,但总结起来,无非是处在食物链顶端的...

  • 生物大量灭绝的原因及航天研究的意义

    在一条食物链中,能量流动的特点是逐级减少的,因此,食物链中生物越靠进食物链的后方,数量就会越少。 例如,一条简单的...

  • 食物链

    又在出差,简短。最近去一个项目,做一个变更~非常不合理的变更。然后,看到了工地上一群人在施工~三伏天,大汗淋漓。突...

  • 食物链

    嗜杀者,都是活在食物链末端。当自食其力都非常艰难时,选择了破坏整个食物链来葬送自己。 今天,公元2...

  • 食物链

    生产者。阳光、空气、水无生命痕迹的物质中自我满足轻吐出颜色、芬芳和氧气它是能量转化的原点不存在消化器官终将被咀嚼默...

  • 食物链

    傍晚的时候,六奶奶送来一罐辣酱。 花生碎和萝卜块做底,腌出酸味的山野菜里浸着细细密密的青椒末。甜辣口儿,一口下去,...

网友评论

    本文标题:食物链POJ1182总结

    本文链接:https://www.haomeiwen.com/subject/czdjixtx.html