• <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
            這道題是直接拿前幾天寫得模版改的;做了幾個修改
            首先刪掉了search,這道題的確不需要,本來沒刪,代碼實在太長,逼得我沒辦法
            第二個,把trie中num[]的意思改掉了,num[]現在存的是字符串在一個數組的標記,
            相當于map的實現,通過這樣我把一個字符串和一個標號對應上了,方便了并查集的操作
            果然很久沒碰并查集了,一寫就出問題,
            主要是我union_set是居然忘了要先find_set一下,這樣寫針對下面這組數據就會出現問題:
            a b
            b a
            a a
            還有一個就是這道題的空輸入問題,要輸出possible,而不是Impossible
            一下是我的垃圾代碼,跑了500多,有誰有更好的發我郵箱哈: zhangjia888334@sohu.com
            #include<iostream>
            #include
            <cstring>
            #define keyNum 
            26
            #define MaxN 
            500005
            struct node{
                
            int parent;
                
            int rank;
                
            int num;//這個顏色出現的次數
                node()
                {
                    num
            =rank=0;
                    parent
            =-1;
                }
            };
            node colour[MaxN];
            int id=0;//數組標記
            struct trie{
                struct trieNode{
            //trie結點的結構
                trieNode 
            *link[keyNum];//下標為 'a' , 'b' , 'c' ,  , 'z' 的指針數組
                int num[keyNum];//插入這個單詞在數組中的位置
                trieNode(){
                    memset(num,
            -1,sizeof(num));//-1表示還未插入數組
                    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));//初始化時為root申請了空間
                    root
            ->init();
                }
                
            int Insert(char []);//返回數組中的位置
                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++;//出現的次數++
                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)//一個沒回路,一個是有回路
                    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));
                }
                
            //下面判斷有幾個parent,若有多個失敗
                solve();
                a.Delete(a.root);
                return 
            0
            }
            posted on 2008-04-08 18:35 zoyi 閱讀(897) 評論(1)  編輯 收藏 引用 所屬分類: acm數據結構

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

            <2008年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            acmer

            online judge

            隊友

            技術

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久99精品久久久久久9蜜桃| 综合网日日天干夜夜久久| av午夜福利一片免费看久久| 久久99精品国产自在现线小黄鸭| 69国产成人综合久久精品| 久久热这里只有精品在线观看| 青青青国产精品国产精品久久久久| 亚洲精品午夜国产va久久| 日本精品久久久久中文字幕8 | 久久久久人妻一区精品| 国产成年无码久久久久毛片| 久久久久久久国产免费看| 久久国产高潮流白浆免费观看| 久久夜色精品国产亚洲| 亚洲美日韩Av中文字幕无码久久久妻妇| 99国产精品久久久久久久成人热| 日本国产精品久久| 天堂无码久久综合东京热| 久久久无码精品亚洲日韩按摩| 久久精品国产男包| 久久精品无码一区二区app| 嫩草影院久久99| 久久精品九九亚洲精品天堂| …久久精品99久久香蕉国产| 久久人人爽人人人人片av| 天天影视色香欲综合久久| 色综合合久久天天给综看| 久久久91人妻无码精品蜜桃HD | 国产精品一区二区久久不卡| 精品无码久久久久国产动漫3d| 久久国产精品波多野结衣AV| 草草久久久无码国产专区| 91久久成人免费| 久久久精品国产| 久久精品人妻中文系列| 久久亚洲精品无码aⅴ大香| 久久久久久久久久久| 99久久精品免费看国产一区二区三区| 久久精品国产亚洲av麻豆蜜芽| av色综合久久天堂av色综合在| 久久久久久夜精品精品免费啦|