• <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>
            我叫張小黑
            張小黑的掙扎生活
            posts - 66,  comments - 109,  trackbacks - 0
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2513
            這道題是直接拿前幾天寫得模版改的;做了幾個(gè)修改
            首先刪掉了search,這道題的確不需要,本來沒刪,代碼實(shí)在太長,逼得我沒辦法
            第二個(gè),把trie中num[]的意思改掉了,num[]現(xiàn)在存的是字符串在一個(gè)數(shù)組的標(biāo)記,
            相當(dāng)于map的實(shí)現(xiàn),通過這樣我把一個(gè)字符串和一個(gè)標(biāo)號(hào)對(duì)應(yīng)上了,方便了并查集的操作
            果然很久沒碰并查集了,一寫就出問題,
            主要是我union_set是居然忘了要先find_set一下,這樣寫針對(duì)下面這組數(shù)據(jù)就會(huì)出現(xiàn)問題:
            a b
            b a
            a a
            還有一個(gè)就是這道題的空輸入問題,要輸出possible,而不是Impossible
            一下是我的垃圾代碼,跑了500多,有誰有更好的發(fā)我郵箱哈: zhangjia888334@sohu.com
            #include<iostream>
            #include
            <cstring>
            #define keyNum 
            26
            #define MaxN 
            500005
            struct node{
                
            int parent;
                
            int rank;
                
            int num;//這個(gè)顏色出現(xiàn)的次數(shù)
                node()
                {
                    num
            =rank=0;
                    parent
            =-1;
                }
            };
            node colour[MaxN];
            int id=0;//數(shù)組標(biāo)記
            struct trie{
                struct trieNode{
            //trie結(jié)點(diǎn)的結(jié)構(gòu)
                trieNode 
            *link[keyNum];//下標(biāo)為 'a' , 'b' , 'c' ,  , 'z' 的指針數(shù)組
                int num[keyNum];//插入這個(gè)單詞在數(shù)組中的位置
                trieNode(){
                    memset(num,
            -1,sizeof(num));//-1表示還未插入數(shù)組
                    memset(link,
            NULL,sizeof(link));
                    }
                void init(){
                    memset(link,
            NULL,sizeof(link));
                    memset(num,
            -1,sizeof(num));
                }
                };
                trieNode
            * root;
                trie()
                {
                    root
            =(trieNode*)malloc(sizeof(trieNode));//初始化時(shí)為root申請(qǐng)了空間
                    root
            ->init();
                }
                
            int Insert(char []);//返回?cái)?shù)組中的位置
                void Delete(trieNode
            *);//釋放空間
            };
            void trie::Delete(trieNode
            * t)
            {
                
            int i;
                
            for(i=0;i<keyNum;i++)
                    
            if(t->link[i])Delete(t->link[i]);
                memset(t
            ->num,0,sizeof(t->num));
                delete(t);
            }
            int trie::Insert(char x[])
            {
                trieNode 
            *current=root;
                
            int i=1;
                
            while(x[i]){
                    
            if(current->link[x[i-1]-'a']==NULL){
                        current->link[x[i-1]-'a']=(trieNode*)malloc(sizeof(trieNode));
                        (current->link[x[i-1]-'a'])->init();
                    }
                    current
            =current->link[x[i-1]-'a'];
                    i++;
                }
                
            if(current->num[x[i-1]-'a']==-1)
                    current->num[x[i-1]-'a']=id++;
                colour[current->num[x[i-1]-'a']].num++;//出現(xiàn)的次數(shù)++
                return current->num[x[i-1]-'a'];
            }
            void init()
            {
                
            int i;
                
            for(i=0;i<MaxN;i++)
                    colour[i].parent
            =i;
            }
            void union_set(
            int x,int y)
            {
                
            if(colour[x].rank>colour[y].rank)
                    colour[y].parent
            =x;
                
            else {
                    colour[x].parent
            =y;
                    
            if(colour[x].rank==colour[y].rank)
                        colour[y].rank
            ++;
                }
            }
            int find_set(int x)
            {
                
            if(x!=colour[x].parent)
                    colour[x].parent
            =find_set(colour[x].parent);
                return colour[x].parent;
            }
            bool comman_father()
            {
                
            int i,p=0;
                p
            =find_set(0);
                
            for(i=1;i<id;i++)
                    
            if(find_set(i)!=p)return false;
                return 
            true;
            }
            void solve()
            {
                
            if(comman_father()==false){
                    printf(
            "Impossible\n");
                    return;
                }
                
            int i,head_end=0;
                
            for(i=0;i<id;i++)
                    
            if(colour[i].num%2==1)//判斷頭和尾
                        head_end
            ++;
                
            if(head_end==2||!head_end)//一個(gè)沒回路,一個(gè)是有回路
                    printf(
            "Possible\n");
                
            else printf("Impossible\n");
            }
            int main()
            {
                char colr1[
            12],colr2[12];
                trie a;
                
            int ncolr1,ncolr2;
                init();
                
            while(scanf("%s%s",colr1,colr2)!=EOF){
                    ncolr1
            =a.Insert(colr1);
                    ncolr2
            =a.Insert(colr2);
                    union_set(find_set(ncolr1),find_set(ncolr2));
                }
                
            //下面判斷有幾個(gè)parent,若有多個(gè)失敗
                solve();
                a.Delete(a.root);
                return 
            0
            }
            posted on 2008-04-08 18:35 zoyi 閱讀(884) 評(píng)論(1)  編輯 收藏 引用 所屬分類: acm數(shù)據(jù)結(jié)構(gòu)

            FeedBack:
            # re: trie樹+并查集
            2008-04-08 19:41 | arena_zp
            不知道為什么,
            我的始終在 1300 + 。。
            莫名~~~~~  回復(fù)  更多評(píng)論
              
            歡迎光臨 我的白菜菜園

            <2016年7月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊(cè)

            acmer

            online judge

            隊(duì)友

            技術(shù)

            朋友

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            97久久精品国产精品青草| 欧美麻豆久久久久久中文| 久久综合精品国产一区二区三区| 色综合久久综合中文综合网| 日韩一区二区三区视频久久| 国产激情久久久久影院老熟女免费 | 久久久久亚洲爆乳少妇无 | 久久伊人五月丁香狠狠色| 久久精品国产亚洲7777| 国产真实乱对白精彩久久| 香蕉久久夜色精品国产小说| 久久精品国产福利国产秒| 精品999久久久久久中文字幕| 国产成年无码久久久久毛片| 久久99国产乱子伦精品免费| AV无码久久久久不卡蜜桃| 国产一区二区精品久久| 国产精品内射久久久久欢欢| 国产精品免费看久久久香蕉| 国内精品欧美久久精品| 婷婷久久综合| 午夜精品久久久久久久久| 久久美女网站免费| 久久久久国产精品嫩草影院| 亚洲七七久久精品中文国产 | 蜜桃麻豆WWW久久囤产精品| 97精品依人久久久大香线蕉97| 精品久久久久久亚洲精品| 久久中文娱乐网| 久久亚洲国产最新网站| 蜜臀av性久久久久蜜臀aⅴ| 91久久九九无码成人网站| 亚洲国产小视频精品久久久三级| 午夜精品久久久久久久久| A级毛片无码久久精品免费| 久久精品中文字幕大胸| 亚洲天堂久久精品| 熟妇人妻久久中文字幕| 伊人色综合久久| 久久精品人人做人人爽97 | 国产欧美久久一区二区|