算法题 查并集的运用 食物链(POJ 1182)重点难点理解

文章讨论了在程序设计竞赛中的代码片段,关注于`if(same(x,y+N)||same(x,y+2*N))`条件在判断x是否吃y或y是否吃x过程中的作用,强调其在排除错误情况时的充分性。
摘要由CSDN通过智能技术生成

内容来自《挑战程序设计竞赛》

以下为原书代码,  我假设你已经看懂作者对本题解法的描述,以及书中使用的方法,我只说一说我对代码的一些难点的理解,关于if中的语句能否充分排除矛盾的讨论。  

int N,K;
    int T[MAX_K],X[MAX_K],Y[MAX_K];
    void solve()
    {
        init(N*3);
        int ans=0;
        for(int i=0;i>K;i++)
        {
            int t=T[i];
            int x=X[i]-1,y=Y[i]-1;  //把范围变为0到N-1 
            
            if(x<0||N<=x||y<0||N<=y)
            {
                ans++;
                continue;
            }
            if(t==1)
            {
            if(same(x,y+N)||same(x,y+2*N))   //***这是我要重点说的
            ans++;
            else
            {
                unite(x,y);
                unite(x+N,y+N);
                unite(x+2*N,y+2*N);
            }
            
            }
            else
            {
                if(same(x,y)||same(x,y+2*N))   //***这是我要重点说的
                ans++;
                else{
                    unite(x,y+N);
                    unite(x+N,y+2*N);
                    unite(x+2*N,y);
                    
                }
                
            }

         } 
         printf("%d/n",ans);
}

请在看懂以上题意,解法讲解,代码的情况下对if中的条件有疑问的情况下再看一下解释,否则可以直接退出了。

为什么if(same(x,y+N)||same(x,y+2*N)) 这个条件足够充要来排除错误情况呢?

我们要判断x,y是否是同一类型,也就是说从反面判断x是否吃y(情况same(x,y+N)),以及y是否吃x(情况same(x,y+2*N))。如果在前面的判断中出现以上任意情况,肯定能确定x,y不是同一类,if能充分地判断。(要是不理解的话建议回头看看x吃y,或y吃x要是正确的话是怎么unite的)。

为什么 if(same(x,y)||same(x,y+2*N))这个条件足够充要来排除错误情况呢?

我们要判断x是否吃y(单向吃),反方向思考,只要x,y不相等(same(x,y+N))并且y不吃x(same(x,y+2*N)),那么剩下的可能只能是x吃y。所以if的条件也是充分的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值