• <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高清热| 国产精品成人99久久久久| 久久亚洲精品成人无码网站| 久久99国产精一区二区三区| 色综合久久88色综合天天 | 精品蜜臀久久久久99网站| 伊人色综合久久天天网| 久久狠狠高潮亚洲精品| 国产成人精品久久一区二区三区| 久久综合九色综合久99| 亚洲综合久久久| 99久久国产综合精品成人影院| 亚洲国产精品成人AV无码久久综合影院 | 亚洲国产精品久久久久婷婷软件 | 久久久噜噜噜久久熟女AA片| 国产精品热久久无码av| 久久精品欧美日韩精品| 无码乱码观看精品久久| 精品免费久久久久国产一区| 久久久久人妻精品一区| 久久精品国产亚洲AV蜜臀色欲| 久久国产香蕉一区精品| 久久99中文字幕久久| 国内精品久久久久影院一蜜桃| 久久人人爽人人爽人人爽| 尹人香蕉久久99天天拍| 亚洲va久久久久| 久久亚洲AV成人无码软件| 2021久久精品免费观看| 久久SE精品一区二区| 亚洲乱码中文字幕久久孕妇黑人| 久久热这里只有精品在线观看| 亚洲另类欧美综合久久图片区| 三级片免费观看久久| 亚洲欧美国产精品专区久久|