• <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>

            巢穴

            about:blank

            dinic

            bfs構建層次圖
            dfs找增廣路
            線形規劃與網絡流24則-24.騎士共存問題

            在一個n*n個方各的國際象棋棋盤上,馬可以攻擊的范圍如圖所示.棋盤上某些方各設置了障礙,騎士不得進入.
            求,棋盤上最多可以放置多少個騎士,使得他們彼此互不攻擊.

            數據范圍:1<=n<=200,0<=m<n^2

            解:對棋盤染色,騎士的跳躍不同色,構成2分圖,求最大獨立集.
            最大獨立集=格子數(參與匹配)-最大匹配,即格子數-障礙數-最大匹配.
            因為數據范圍過大,用km求最大匹配顯然tle了.于是用了dinic..第一次寫..還是仿寫的..
            #include <iostream>
            #include 
            <fstream>
            using namespace std;
            #define INF 99999999

            ifstream fin(
            "flow.in");
            ofstream fout(
            "flow.out");
            int h[8]={-1,-2,-2,-1,1,2,2,1};
            int l[8]={-2,-1,1,2,2,1,-1,-2};
            bool can[201][201];
            int maxflow=0;

            const int MAXN=200*200+2;
            struct node
            {
                
            int x,y,c;
                
            int op;
                
            int next;
            }
            p[MAXN*8*2+1];
            int first[MAXN];
            int level[MAXN],st[MAXN],t[MAXN],state[MAXN];
            int count_=0;
            void addedge(int a,int b,int c)
            {
                
                count_
            ++;
                p[count_].x
            =a,p[count_].y=b,p[count_].c=c;
                p[count_].next
            =first[a];
                p[count_].op
            =count_+1;first[a]=count_;
                count_
            ++;
                p[count_].x
            =b,p[count_].y=a,p[count_].c=0;
                p[count_].next
            =first[b];
                p[count_].op
            =count_-1;first[b]=count_;
            }


            int N,M;
            int S,T;
            bool make_level()
            {
                
                
            int head,tail,i,j;
                memset(level,
            -1,sizeof(level));
                level[S]
            =0;
                st[head
            =tail=0]=S;
                
            while(head<=tail)
                
            {
                    i
            =st[head++];
                    
            for (int v=first[i];v!=-1;v=p[v].next)
                    
            {
                        
                        j
            =p[v].y;
                        
            if (p[v].c&&level[j]==-1)
                        
            {
                            level[j]
            =level[i]+1;
                            
            if (j==T) return true;
                            st[
            ++tail]=j;
                        }

                    }

                }

                
            return false;
            }

            void dinic()
            {
                
            int i,j,delta,Stop;
                st[Stop
            =1]=S;
                
            for (int i=S;i<=T;i++)
                
            {
                    t[i]
            =first[i];
                }

                
            while(Stop)
                
            {
                    i
            =st[Stop];
                    
            if (i!=T)
                    
            {
                        
            while(t[i]!=-1)
                        
            {
                            
            if (p[t[i]].c&&level[i]+1==level[j=p[t[i]].y]) break;
                            t[i]
            =p[t[i]].next;
                        }

                        
            if (t[i]!=-1)
                        
            {
                            st[
            ++Stop]=j;
                            state[Stop]
            =t[i];
                        }

                        
            else
                        
            {
                            Stop
            --;
                            level[i]
            =-1;
                        }

                    }

                    
            else
                    
            {
                        delta
            =INF;
                        
            for (i=Stop;i>=2;i--)
                            
            if (p[state[i]].c<delta) delta=p[state[i]].c;
                        maxflow
            +=delta;
                        
            for (i=Stop;i>=2;i--)
                        
            {
                            p[state[i]].c
            -=delta;
                            
            int op_=p[state[i]].op;
                            p[op_].c
            +=delta;
                            
            if (p[state[i]].c==0)    Stop=i-1;            
                        }

                    }

                }

            }

            int main()
            {
                memset(can,
            true,sizeof(can));
                memset(first,
            -1,sizeof(first));
                fin
            >>N>>M;
                
            for (int i=1;i<=M;i++)
                
            {
                    
            int x,y;
                    fin
            >>x>>y;
                    can[x][y]
            =false;
                }

                
                S
            =0,T=N*N+1;
                
            //for (int i=S;i<=T;i++)
                 
            //first[i]=-1;
                for (int i=1;i<=N;i++)
                
            {
                    
            for (int j=1;j<=N;j++)
                    
            {
                        
            if (!can[i][j]) continue;
                        
            if ((i+j)%2==0{addedge(((i-1)*N+j),T,1);continue;}
                        
            int id1=((i-1)*N+j);
                        addedge(
            0,id1,1);
                        
            for (int k=0;k<8;k++)
                        
            {
                            
            int x,y;
                            x
            =i+h[k],y=j+l[k];
                            
            if (x<1||y<1||x>N||y>N) continue;
                               
            if (!can[x][y]) continue;
                               
            int id2=((x-1)*N+y);
                               addedge(id1,id2,INF);
                        }

                    }

                }

                
                
            while(make_level())
                    dinic();

                fout
            <<N*N-M-maxflow<<endl;
                system(
            "pause");
                
            return 0;
            }

            posted on 2009-11-10 21:34 Vincent 閱讀(687) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構與算法

            国产精品久久久久久久久鸭| 麻豆av久久av盛宴av| 国产午夜久久影院| 久久人搡人人玩人妻精品首页| 无码任你躁久久久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国内精品久久久久久不卡影院| 99久久精品国产综合一区| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久国产乱子伦精品免费午夜| 伊人情人综合成人久久网小说| 久久婷婷五月综合97色| 国内精品久久久久久久coent| 久久精品久久久久观看99水蜜桃| 成人久久久观看免费毛片| 中文字幕亚洲综合久久菠萝蜜| 国产精品久久久久国产A级| 亚洲中文字幕伊人久久无码| 国产成人久久AV免费| 久久免费视频1| 人人狠狠综合久久亚洲| 999久久久国产精品| 久久久无码一区二区三区| 亚洲国产成人久久综合碰| 青青青青久久精品国产| 国内精品久久久久影院优| 久久人人添人人爽添人人片牛牛| 国产福利电影一区二区三区,免费久久久久久久精 | 欧洲精品久久久av无码电影| 欧美精品丝袜久久久中文字幕 | 久久精品九九亚洲精品| 久久久久久久久久久精品尤物 | 香蕉久久夜色精品国产2020| 中文字幕成人精品久久不卡| 久久亚洲欧美国产精品| 久久一日本道色综合久久| 久久天天躁狠狠躁夜夜2020一| 亚洲国产精品狼友中文久久久 | 亚洲国产精品成人久久| 久久久这里有精品| 伊人久久大香线蕉av一区|