• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            pku 1182

             2009年7月12日 星期日

            題目鏈接:PKU 1182 食物鏈
             
            分類:并查集的拓展(經典)


            題目分析與算法模型

                    本題是一道經典的并查集的拓展,其中比較一般的解法是設立三個group,因為一共有三種動物。但其實有一種更加簡便的方法,具體如下,利用向量的思考模式將三個group合并成一個并查集,同時對每個節點保持其到根結點的相對類別偏移量,定義為:
            0——同類;
            1——食物;
            2——天敵;
            對于樹中的每一個節點(動物),記錄其與根節點的相對偏移量,即上面的0,1和2,這樣就可以根據相對平移量計算出其和根節點所代表的動物的關系,合并節點時,注意兩棵樹的根節點之間的相對偏移量,這里有幾個公式需要自己推導,都在代碼中了;

            Code:

             1
            #include<stdio.h>
             2#define max 50005
             3
             4int n,k,i,j,parent[max],kind[max],count,a,b,d;
             5
             6void init(int n)
             7{
             8    for(j=1;j<=n;j++)
             9    {
            10        parent[j]=-1;
            11        kind[j]=0;
            12    }

            13}

            14int find(int x)
            15{
            16    int t=parent[x];
            17    if(t<0)return x;
            18    parent[x]=find(t);
            19    kind[x]=(kind[x]+kind[t])%3;
            20    return parent[x];
            21}

            22void Union(int x,int y,int d)
            23{
            24    if(x>n||y>n)count++;
            25    else if(d==1)
            26    {
            27        int root1=find(x),root2=find(y);
            28        if(root1==root2)
            29        {
            30            if(kind[x]!=kind[y])count++;
            31        }

            32        else
            33        {
            34            if(parent[root1]<parent[root2])   //root1為根
            35            {
            36                parent[root1]+=parent[root2];
            37                parent[root2]=root1;
            38                kind[root2]=(kind[x]-kind[y]+3)%3;       //需要自己推導
            39            }

            40            else                              //root2為根
            41            {
            42                parent[root2]+=parent[root1];
            43                parent[root1]=root2;
            44                kind[root1]=(kind[y]-kind[x]+3)%3;
            45            }

            46        }

            47    }

            48    else   //d=2
            49    {
            50        if(x==y)count++;
            51        else
            52        {
            53            int root1=find(x),root2=find(y);
            54            if(root1==root2)
            55            {
            56                if(kind[x]!=(kind[y]+1)%3)count++//需要自己推導
            57            }

            58            else
            59            {
            60                if(parent[root1]<parent[root2])   //root1為根
            61                {
            62                    parent[root1]+=parent[root2];
            63                    parent[root2]=root1;
            64                    kind[root2]=(kind[x]-kind[y]+5)%3;       //需要自己推導
            65                }

            66                else                              //root2為根
            67                
            68                    parent[root2]+=parent[root1];
            69                    parent[root1]=root2;
            70                    kind[root1]=(kind[y]-kind[x]+4)%3;      //需要自己推導
            71                }

            72            }

            73        }

            74    }

            75}

            76int main()
            77{
            78    scanf("%d%d",&n,&k);
            79    init(n);
            80    count=0;
            81    for(i=0;i<k;i++)
            82    {
            83        scanf("%d%d%d",&d,&a,&b);
            84        Union(a,b,d);
            85    }

            86    printf("%d\n",count);
            87    return 0;
            88}

            89

            posted on 2009-07-13 00:08 蝸牛也Coding 閱讀(1196) 評論(3)  編輯 收藏 引用

            評論

            # re: pku 1182[未登錄] 2009-12-17 12:12 YY

            YTE   回復  更多評論   

            # re: pku 1182 2010-02-12 16:04 Y

            大家注意了,那個1代表根是這個節點的食物,別誤解了  回復  更多評論   

            # re: pku 1182[未登錄] 2010-03-26 19:15 菜鳥

            可以簡單說一下這幾條語句什么意思么?
            kind[x]=(kind[x]+kind[t])%3;
            kind[root2]=(kind[x]-kind[y]+3)%3;
            kind[root2]=(kind[x]-kind[y]+5)%3;
              回復  更多評論   

            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            人人狠狠综合久久88成人| 69久久夜色精品国产69| 久久精品国产精品亚洲| 久久综合伊人77777| 久久久精品久久久久影院| 久久天堂AV综合合色蜜桃网 | 日日噜噜夜夜狠狠久久丁香五月 | 97久久超碰国产精品2021| 中文字幕久久欲求不满| 久久久久久国产精品美女| 久久精品国产福利国产秒| 三级三级久久三级久久| 国产成人久久777777| 欧美日韩精品久久久免费观看| 国产精品久久久天天影视| 久久国语露脸国产精品电影| 久久精品国产国产精品四凭| 精品久久一区二区| 久久久久亚洲AV无码观看| 久久AAAA片一区二区| 2020久久精品国产免费| 久久人人爽人人爽人人片AV不| 中文字幕久久欲求不满| 久久国产精品-久久精品| 欧洲成人午夜精品无码区久久| 亚洲日韩欧美一区久久久久我| 国产精品VIDEOSSEX久久发布| 国产精品久久久久久久久鸭| 狠狠色丁香久久婷婷综合| 亚洲国产成人久久综合野外| 久久精品国产亚洲一区二区三区| 久久综合九色综合97_久久久| 久久中文骚妇内射| 日产精品99久久久久久| 日本强好片久久久久久AAA| 欧美一区二区三区久久综合| 青青草原精品99久久精品66| 色88久久久久高潮综合影院| 97久久精品午夜一区二区| 国产Av激情久久无码天堂| 久久97精品久久久久久久不卡|