• <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>
            隨筆 - 40, 文章 - 0, 評論 - 19, 引用 - 0
            數(shù)據(jù)加載中……

            TOJ 3345 Chinese Chess 二分匹配 匈牙利算法 擴(kuò)展

            TOJ 3345 Chinese Chess http://acm.tju.edu.cn/toj/showp3345.html
            雙鏈表實(shí)習(xí)雙向鄰接表,正向圖反向圖,匈牙利匹配后,枚舉刪除匹配邊,兩邊做重新查找增廣路操作,如果都沒法查到則證明是重要邊,還原原匹配時候要注意細(xì)節(jié)。

            優(yōu)化1:求最大匹配時候先能匹配就匹配上。
            優(yōu)化2:標(biāo)記已經(jīng)確定不是必要點(diǎn)的行和列 flag[]和flag2[]
            注意1:刪除匹配邊后 應(yīng)在匹配邊的兩面點(diǎn) 分別查詢
            注意2:沒查到新匹配要還原匹配邊

            #include
            <stdio.h>
            #include
            <string.h>
            const int size2 = 100110;
            const int size1 = 10110;
            int n , m , k ;
            struct node{
                node 
            *p;
                node 
            *q;
                
            int v;
                
            int v2;
            };
            int val;

            node edg[size2];

            bool visit[size1];
            int pp[size1];
            bool flag[size1];
            bool flag2[size1];

            node 
            *g[size1];
            node 
            *g1[size1];

            int ppre[size1];
            int ppr[size1];

            int nxy[size1];
            inline 
            bool check(int x , int y , int fc){
                node 
            *now = g[x];
                
            while(now != NULL){
                    
            if(now->== y){
                        
            if(fc == 0)
                            
            return true;
                        
            if(fc == 1){
                            now
            ->= -1;
                            
            return true;
                        }
                        
            if(fc == 2){
                            now
            ->= val;
                            
            return true;
                        }
                    }
                    
            else{
                        now 
            = now->p;
                    }
                }
                
            return false;
            }

            inline 
            bool check2(int x , int y , int fc){
                node 
            *now = g1[x];
                
            while(now != NULL){
                    
            if(now->v2 == y){
                        
            if(fc == 0)
                            
            return true;
                        
            if(fc == 1){
                            now
            ->v2 = -1;
                            
            return true;
                        }
                        
            if(fc == 2){
                            now
            ->v2 = val;
                            
            return true;
                        }
                    }
                    
            else{
                        now 
            = now->q;
                    }
                }
                
            return false;
            }
            inline 
            bool find(int a){
                node 
            *now = g[a];
                
            while(now != NULL){
                         
            int i = now->v;
                         
            if(i != -1){
                             
            if(!visit[i] ){
                                visit[i] 
            = true;
                                
            if(pp[i] == -1 ||find(pp[i])){
                                    pp[i] 
            = a;
                                    nxy[a] 
            = i;
                                    
            return true;
                                }
                            }
                         }
                        now 
            = now->p;
                }
                
            return false;
            }

            inline 
            bool find2(int a){
                node 
            *now = g1[a];
                
            while(now != NULL){
                         
            int i = now->v2;
                         
            if(i != -1){
                             
            if(!visit[i] ){
                                visit[i] 
            = true;
                                
            if(nxy[i] == -1 ||find2(nxy[i])){
                                    nxy[i] 
            = a;
                                    pp[a] 
            = i;
                                    
            return true;
                                }
                            }
                         }
                        now 
            = now->q;
                }
                
            return false;
            }

            void output(){
                printf(
            "\n\n");
                
            forint i = 1 ; i <= m ; i++)
                    printf(
            "%d -> %d\n",pp[i],i);
                    printf(
            "\n");
                
            forint i = 1 ; i <= n ; i++)
                    printf(
            "%d -> %d\n",i,nxy[i]);
                printf(
            "\n\n");
            }

            void output1(int x){
                node 
            *now = g1[x];
                
            while(now != NULL){
                         
            int i = now->v2;

                         printf(
            "  %d",i);
                        now 
            = now->q;
                }
                printf(
            "\n");
            }

            int main(){
                    
            int a1,i,a2;
                    
            int _case = 0;
                    
            int num;
                    
            while(scanf("%d%d%d",&n,&m,&k)!=EOF){
                        num 
            = 0;
                        memset(g,
            0,sizeof(g));
                        memset(g1,
            0,sizeof(g1));
                        memset(pp,
            -1,sizeof(pp));
                        memset(nxy,
            -1,sizeof(nxy));
                        
            for(i = 1; i <= k ; i++){
                            scanf(
            "%d%d",&a1,&a2);
                            
            if(check(a1,a2,0)) continue;
                            edg[i].v 
            = a2;
                            edg[i].v2 
            = a1;
                            edg[i].p 
            = NULL;
                            edg[i].q 
            = NULL;

                            
            if(g[a1] == NULL){
                                g[a1] 
            = &edg[i];
                            }
            else{
                                edg[ppre[a1]].p 
            = &edg[i];
                            }

                            
            if(g1[a2] == NULL){
                                g1[a2] 
            = &edg[i];
                            }
            else{
                                edg[ppr[a2]].q 
            = &edg[i];
                            }

                            ppre[a1] 
            = i ;
                            ppr[a2] 
            = i ;

                            
            if(pp[a2] == -1 && nxy[a1] == -1){
                                pp[a2] 
            = a1;
                                nxy[a1] 
            = a2;
                                num
            ++;
                            }
                        }
                        
            for(i = 1 ; i <= m ; i++){
                            
            if(pp[i] == -1){
                                memset(visit,
            0,sizeof(visit));
                                
            if(find2(i)){
                                    num
            ++;
                                }
                            }
                        }
                        memset(flag,
            0,sizeof(flag));
                        memset(flag2,
            0,sizeof(flag2));
                        
            int ans = 0;
                        
            for(i = 1 ; i <= m ; i++){
                            
            if(pp[i] != -1){
                                
            int key = 0;
                                
            int now = pp[i];
                                pp[i] 
            = -1 ;
                                nxy[now] 
            = -1;
                                
            if(flag[pp[i]] == 0){
                                    check(now,i,
            1);
                                    memset(visit,
            0,sizeof(visit));
                                    
            if(find(now)){
                                        key 
            = 1;
                                    }
                                    val 
            = i ;
                                    check(now,
            -1,2);
                                }

                                
            if(flag2[i] == 0 && key == 0 ){
                                    check2(i,now,
            1);
                                    memset(visit,
            0,sizeof(visit));
                                    
            if(find2(i)){
                                        key 
            = 1;
                                    }
                                    val 
            = now ;
                                    check2(i,
            -1,2);
                                }
                                 
            if(!key){
                                        ans
            ++;
                                            nxy[now] 
            = i;
                                        pp[i] 
            = now;
                                 }
                                 
            else{
                                    flag[now] 
            = 1 ;
                                    flag2[i] 
            = 1 ;
                                 }
                            }
            //右側(cè)有邊
                        }
                        printf(
            "Board %d have %d important blanks for %d chessmen.\n",++_case,ans,num);
                    }
                
            return 0;
            }

            posted on 2009-08-07 00:17 hadn't 閱讀(307) 評論(0)  編輯 收藏 引用


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


            亚洲午夜无码久久久久| 国产69精品久久久久9999APGF| 囯产极品美女高潮无套久久久| 久久久国产精华液| 国产综合精品久久亚洲| 久久九九青青国产精品| 久久九九有精品国产23百花影院| 国产成人无码精品久久久性色| 国产精品久久久久久久久久影院| 欧美一级久久久久久久大片| 久久久久亚洲AV综合波多野结衣 | 亚洲国产精品成人久久| 99久久综合国产精品免费| 亚洲精品综合久久| 国产精品中文久久久久久久| 伊人久久大香线蕉AV色婷婷色| 久久中文字幕人妻丝袜| 久久国产劲爆AV内射—百度| 午夜精品久久久久久毛片| 99久久99久久久精品齐齐 | 国产三级观看久久| 久久精品成人| 久久久久国产精品人妻| 亚洲AV日韩精品久久久久 | 国产精品综合久久第一页| 三级韩国一区久久二区综合| 国产亚洲精久久久久久无码77777| 亚洲欧美伊人久久综合一区二区| 潮喷大喷水系列无码久久精品| 香港aa三级久久三级| 天天综合久久一二三区| 久久久黄色大片| 久久99热国产这有精品| 青青草原综合久久大伊人导航| 欧美日韩精品久久久久| 国产欧美久久久精品| 性做久久久久久久久浪潮| 久久精品人人做人人爽97| 国产精品欧美亚洲韩国日本久久| 伊人久久成人成综合网222| 久久人人爽爽爽人久久久|