• <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 食物鏈
             
            分類:并查集的拓展(經(jīng)典)


            題目分析與算法模型

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

            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;       //需要自己推導(dǎo)
            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++//需要自己推導(dǎo)
            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;       //需要自己推導(dǎo)
            65                }

            66                else                              //root2為根
            67                
            68                    parent[root2]+=parent[root1];
            69                    parent[root1]=root2;
            70                    kind[root1]=(kind[y]-kind[x]+4)%3;      //需要自己推導(dǎo)
            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 閱讀(1192) 評論(3)  編輯 收藏 引用

            評論

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

            YTE   回復(fù)  更多評論   

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

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

            # 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;
              回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产另类久久久精品小说 | 波多野结衣中文字幕久久| 久久综合久久美利坚合众国| 欧美午夜A∨大片久久| 久久久久国产精品嫩草影院| 国产精品99久久免费观看| 亚洲中文字幕无码久久2020 | 无码人妻久久久一区二区三区| 2021国产精品午夜久久| 中文字幕乱码久久午夜| 无码人妻少妇久久中文字幕蜜桃| 久久久噜噜噜久久中文字幕色伊伊| 久久综合亚洲鲁鲁五月天| 亚洲AV无一区二区三区久久| 久久久久久国产精品无码超碰| 国产精品女同一区二区久久| 亚洲国产精品18久久久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久精品无码一区二区三区日韩| 人妻精品久久久久中文字幕69| 久久精品九九亚洲精品| 久久伊人精品青青草原高清| 亚洲综合熟女久久久30p| 72种姿势欧美久久久久大黄蕉| 久久亚洲国产精品成人AV秋霞| 无码日韩人妻精品久久蜜桃 | 无码人妻久久一区二区三区| 2021久久国自产拍精品| AA级片免费看视频久久| 久久精品国产99国产精品导航| 久久超乳爆乳中文字幕| 久久精品国产一区二区| 九九久久自然熟的香蕉图片| 精品久久久久久久中文字幕| 精品久久久久久| 久久这里只精品国产99热| 2019久久久高清456| 国产成人香蕉久久久久| 新狼窝色AV性久久久久久| 久久播电影网| 国内精品久久久久伊人av|