POJ 1128食物連鎖

この質問はかろうじてに従事する方法を理解チェックして、ブログをたくさん読んで、右との最初のセットを作るされ
、元のタイトルのリンク食物連鎖の

#include<stdio.h>//想这道死了不少脑细胞
struct node
{
    int pre;
    int relation;
} p[50002];
/*此处relation有三种取值(假设节点x的父节点为rootx,即p[x].parent=rootx):
   p[x].relation=0   ……表示节点x与其父节点rootx的关系是:同类
   p[x].relation=1   ……表示节点x与其父节点rootx的关系是:被根结点吃
   p[x].relation=2   ……表示节点x与其父节点rootx的关系是:吃根结点
*/
int find(int x)
{
    if(x!=p[x].pre)
    {
        int fx=p[x].pre;
        p[x].pre=find(p[x].pre);
        p[x].relation=(p[x].relation+p[fx].relation)%3;
    }
    return p[x].pre;
}

int main()
{
    int n, k;
    int q, a, b;
    int sum = 0;
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; ++i)
    {
        p[i].pre = i;
        p[i].relation = 0;
    }
    for(int i = 1; i <= k; ++i)
    {
        scanf("%d%d%d", &q, &a, &b);//a为父亲,b为儿子,这里默认父吃子
        if(a > n || b > n)
        {
            sum++;
        }
        else if(q == 2 && a == b)
        {
            sum++;

        }
        else
        {
            int fa = find(a);
            int fb = find(b);
            if(fa == fb)//如果a b在同一个集合
            {//q-1是父亲对于儿子的偏移量
                if(p[b].relation!=(p[a].relation+q-1)%3)//判断偏移量是否相同
                //=后面是爷爷的偏移量  =前面是儿子的偏移量 即判断儿子和爷爷是否同类
                    sum++;
            }
            else
            {
                p[fb].pre = fa;//现在儿子(的根节点)变成父亲(的根节点)的儿子了
                int t=(3-p[b].relation)%3;//t是父相对于儿子的根节点的偏移量,
                //就是判断子吃父还是父吃子
                int s=(p[a].relation+q-1)%3;//前面说过这是爷的偏移量
                p[fb].relation = (s+t)%3;//(3-p[b].relation+(q - 1) +p[a].relation ) % 3;//这是求儿子根节点和父根节点的关系,差点没看懂
                        //相当于(s+t)%3;
            }
        }

    }
    printf("%d\n", sum);
    return 0;
}
公開された17元の記事 ウォンの賞賛3 ビュー519

おすすめ

転載: blog.csdn.net/RUBGH/article/details/105042251