• <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>
            隨筆 - 97, 文章 - 22, 評(píng)論 - 81, 引用 - 0
            數(shù)據(jù)加載中……

            Pku 1632 Vase Collection (Dfs)

            問題描述:
            給定一些關(guān)系,是個(gè)二分圖,要求它的最大完美匹配。
            解題思路:
            枚舉左邊的點(diǎn),對(duì)任意一個(gè)點(diǎn)枚舉它的邊子集,再在枚舉到的邊子集的右邊點(diǎn)集中以相同方式枚舉,最后形成左右兩邊均為K的點(diǎn),檢測是否為完全二分圖即可。

            代碼如下:
            #include <iostream>
            #include 
            <vector>
            using namespace std;

            int t;
            int n, i;

            vector 
            < int > lvec[40], rvec[40];
            int l, r, dep;
            int bo[40], Max;

            struct Stack
            {
                
            int a[100];
                
            int top;
            }
            Left, Right;

            int map[40][40];


            //檢查給定圖是否是K-完美匹配圖(這里K == Left.top)
            int Process()
            {
                
            int i, j;
                
            //Stack Left
                
            //Stack Right
                
            //檢查兩個(gè)棧中是否有完全邊,即K*K條邊

                
            for(i = 0; i < Left.top; i++)
                
            {
                    
            for(j = 0; j < Right.top; j++)
                    
            {
                        
            if(!map[ Right.a[j] ][ Left.a[i] ])
                            
            return 0;
                    }

                }


                
            return 1;
            }



            //對(duì)右邊的第一個(gè)被左邊點(diǎn)枚舉到的點(diǎn)進(jìn)行枚舉,枚舉它的邊子集
            int rdfs(int u, int index)
            {
                
            int i, size = rvec[u].size();

                
            if(size < Left.top)
                    
            return 0;

                
            if(Right.top > Left.top)
                    
            return 0;

                
            if(Left.top == Right.top)
                
            {
                    
            if( Process() )
                        
            return 1;
                }


                
            for(i = index; i < size; i++){
                    Right.a[ Right.top
            ++ ] = rvec[u][i];
                    
            if( rdfs(u, i+1) )
                        
            return 1;
                    Right.top 
            --;
                }

                
            return 0;
            }


            //左邊任選一個(gè)點(diǎn)枚舉他的邊子集

            void ldfs(int u, int index)
            {
                
            int i, size = lvec[u].size();

                
            if(Left.top > 10)
                    
            return ;

                Right.top 
            = 0;


                
            if(Left.top > Max && rdfs(Left.a[0], 0) )
                
            {
                    
            if(Left.top > Max)
                        Max 
            =  Left.top;
                }


                
            for(i = index; i < size; i++){
                    Left.a[ Left.top
            ++ ] = lvec[u][i];
                    ldfs(u, i
            +1);
                    Left.top 
            --;
                }

            }


            int main()
            {
                
            int i, j;
                scanf(
            "%d"&t);

                
            while(t--)
                
            {
                    Max 
            = 0;
                    scanf(
            "%d"&n);

                    memset(map, 
            0sizeof(map));

                    
            for(i = 1; i <= 36; i++)
                    
            {
                        lvec[i].clear();
                        rvec[i].clear();
                    }


                    memset( bo, 
            0sizeof(bo) );

                    
            for(i = 0; i < n; i++)
                    
            {
                        scanf(
            "%d %d"&l, &r);
                        map[l][r] 
            = 1;
                        bo[ l ] 
            = 1;
                    }


                    
            for(i = 1; i <= 36; i++){

                        
            for(j = 1; j <= 36; j++){

                            
            if(map[i][j])
                            
            {
                                lvec[i].push_back( j );
                                rvec[j].push_back( i );
                            }

                        }

                    }


                    
            for(i = 1; i <= 36; i++)
                    
            {
                        
            if(bo[i]){
                            Left.top 
            = 0;
                            ldfs(i, 
            0);
                        }

                    }

                    printf(
            "%d\n", Max);
                }

            }

            posted on 2009-02-15 21:15 英雄哪里出來 閱讀(405) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACM

            99国产精品久久| 大香伊人久久精品一区二区| 中文字幕日本人妻久久久免费| 久久综合香蕉国产蜜臀AV| 久久久久高潮毛片免费全部播放 | 久久精品国产亚洲AV电影| 久久人人爽人人爽人人av东京热| 久久亚洲sm情趣捆绑调教| 亚洲AV无码久久精品色欲| 99国产欧美久久久精品蜜芽| 久久99精品久久久久久齐齐| 国产精品久久久久久久app| 狠狠狠色丁香婷婷综合久久五月 | 久久99国产精一区二区三区| 精品国产一区二区三区久久蜜臀| 一本久久a久久精品亚洲| 一级做a爱片久久毛片| 久久人人爽人人爽人人片AV麻烦| 日韩欧美亚洲综合久久影院d3| 无码人妻久久一区二区三区蜜桃 | 三级三级久久三级久久| 日本三级久久网| 999久久久免费精品国产| 久久精品国产日本波多野结衣| 久久国产成人精品国产成人亚洲| 99国产欧美久久久精品蜜芽| 97精品国产97久久久久久免费| 亚洲国产婷婷香蕉久久久久久| 久久婷婷久久一区二区三区| 无码人妻精品一区二区三区久久久| 久久久久亚洲AV综合波多野结衣 | 久久人妻少妇嫩草AV无码蜜桃| 久久se精品一区精品二区| 久久国产亚洲精品无码| 精产国品久久一二三产区区别| 色99久久久久高潮综合影院| 91精品无码久久久久久五月天| 国产精品无码久久综合| 久久Av无码精品人妻系列| 久久人人妻人人爽人人爽| 久久久婷婷五月亚洲97号色|