• <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
            數據加載中……

            TOJ 3345 Chinese Chess 二分匹配 匈牙利算法 擴展

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

            優化1:求最大匹配時候先能匹配就匹配上。
            優化2:標記已經確定不是必要點的行和列 flag[]和flag2[]
            注意1:刪除匹配邊后 應在匹配邊的兩面點 分別查詢
            注意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 ;
                                 }
                            }
            //右側有邊
                        }
                        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 閱讀(306) 評論(0)  編輯 收藏 引用

            无码人妻久久一区二区三区蜜桃| 久久这里只精品国产99热| 香蕉久久永久视频| 伊人久久无码中文字幕| 91久久精一区二区三区大全| 婷婷久久综合九色综合98| 久久男人AV资源网站| 久久精品人人做人人爽电影| 99久久超碰中文字幕伊人| 国产精品热久久无码av| 伊人久久无码中文字幕| 97精品伊人久久久大香线蕉 | 国产精品乱码久久久久久软件 | 久久激情亚洲精品无码?V| 亚洲国产小视频精品久久久三级| 欧美大战日韩91综合一区婷婷久久青草 | 国产高潮久久免费观看| 国内高清久久久久久| 国产精品成人99久久久久 | 精品国产乱码久久久久久郑州公司| 91精品国产高清久久久久久io| 久久久久国产精品麻豆AR影院 | 久久久久久久97| 亚洲国产婷婷香蕉久久久久久| 久久久久人妻一区二区三区vr| 久久久艹| 99久久国产亚洲高清观看2024 | 精品国产乱码久久久久久浪潮| 熟妇人妻久久中文字幕| 日产久久强奸免费的看| 国产L精品国产亚洲区久久| 996久久国产精品线观看| 亚洲国产精品无码久久久不卡| 久久毛片免费看一区二区三区| 国产伊人久久| 久久99国产精品成人欧美| 777久久精品一区二区三区无码| 国产精品岛国久久久久| 国产精品青草久久久久婷婷| 久久99国产乱子伦精品免费| 99久久精品费精品国产一区二区 |