• <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>
            獨立博客: 哲學與程序

            哲學與程序

            最小割 ZOJ@2788

                最大流最小割定理介紹:把一個流網絡的頂點集劃分成兩個集合S和T,使得源點s ∈S且匯點t ∈T,割(S,T)的容量C(S,T) = ∑ Cuv, 其中u∈S且v∈T。
            從直觀上看,截集(S,T)是從源點s到匯點t的必經之路,如果該路堵塞則流從s無法到達t。于是我們可以得到最大流最小割定理:任意一個流網絡的最大流量等于該網絡的最小的割的容量。
                最小割問題:ZOJ@2788
                題意:在一棟樓中有若干房間,一個房間有若干扇門通往別的房間,現在房間中有一個secure room。由于有一些敵人已經潛入某一些房間,現在問關閉最少的一些門,使得敵人們到達不了secure room。對于一扇門連通A-B,若控制面板CP在A方,則總是可以從A->B,但是若關上門,則B不能到達A。
                解法:最大流。首先通過floyd算法判斷是否敵人總是可以到達secure room,如果能直接輸出結果;如果不能,則通過最大流算法求解即可。對于一扇門A-B,CP在A方則從A連一條有向邊到B,容量為無窮大,從B連一條邊到A,容量為1。兩個房間之間可能有多扇門,邊的容量累加即可。增加一個源點,從源點連邊到有敵人的房間,容量為1。對圖求最大流即為結果。
            代碼如下:
            // 2389732      2011-01-20 15:06:16        Accepted      2788      C++      0      184      *******
            #include<cstdio>
            #include
            <algorithm>
            #include
            <cstring>
            #define MAXN 22
            #define inf 1000000
            int map[MAXN][MAXN];
            int flow[MAXN][MAXN];
            int max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){ 
                
            int pre[MAXN],que[MAXN],p,q,t,i,j;
                
            int d[MAXN];
                
            int tmp;
                
            if (source==sink) return inf; 
                
            for (i=0;i<n;i++
                    
            for    (j=0;j<n;flow[i][j++]=0); 
                
            for (;;){ 
                    
            for (i=0;i<n;pre[i++]=0); 
                    pre[t
            =source]=source+1,d[t]=inf; 
                    
            for (p=q=0;p<=q&&!pre[sink];t=que[p++]) 
                           
            for (i=0;i<n;i++
                            
            if (!pre[i]&&(tmp=mat[t][i]-flow[t][i])) 
                                 pre[que[q
            ++]=i]=t+1,d[i]=d[t]<tmp?d[t]:tmp; 
                            
            else if (!pre[i]&&(tmp=flow[i][t])) 
                             pre[que[q
            ++]=i]=-t-1,d[i]=d[t]<tmp?d[t]:tmp; 
                    
            if (!pre[sink]) break
                    
            for (i=sink;i!=source;) 
                           
            if (pre[i]>0
                            flow[pre[i]
            -1][i]+=d[sink],i=pre[i]-1
                           
            else 
                            flow[i][
            -pre[i]-1]-=d[sink],i=-pre[i]-1
                } 
                tmp 
            = 0;
                
            for (i=0;i<n;tmp+=flow[source][i++]); 
                
            return tmp; 
            }
            int main()
            {
                
            int T, n, m, k, y;
                
            char str[3];
                
            int d[MAXN];
                scanf(
            "%d",&T);
                
            while(T--)
                {
                    scanf(
            "%d%d",&m,&n);
                    n
            ++;
                    memset(map,
            0,sizeof(map));
                    memset(flow,
            0,sizeof(flow));
                    
            for(int i = 1; i <= m; i++){
                        scanf(
            "%s %d",str, &k);
                        d[i] 
            = (strlen(str) == 1);
                        
            if(d[i])map[0][i] = inf;
                        
            for(int j = 0; j < k; j++){
                            scanf(
            "%d",&y);
                            y
            ++;
                            flow[i][y] 
            = 1;
                            map[i][y] 
            += inf;
                            map[y][i] 
            += 1;
                        }
                    }
                    
            // Checking always exists a path to secure room. Output "PANIC ROOM BREACH"!
                    for(k = 1; k <= m; k++)  
                        
            for(int i = 1; i <= m; i++)
                            
            for(int j = 1; j <= m; j++)
                                
            if(flow[i][k]&&flow[k][j])
                                    flow[i][j] 
            = 1;
                    
            for(k = 1; k <= m && !(d[k] && flow[k][n]); k++);
                    
            if(k <= m)
                        printf(
            "PANIC ROOM BREACH\n");
                    
            else
                        printf(
            "%d\n", max_flow(m+1,map,0,n,flow));
                }
                
            return 0;
            }


            posted on 2011-01-20 15:52 哲學與程序 閱讀(364) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm 、C & C++

            導航

            公告

            歡迎訪問 http://zhexue.sinaapp.com

            常用鏈接

            隨筆分類(37)

            隨筆檔案(41)

            Algorithm

            最新隨筆

            搜索

            最新評論

            獨立博客: 哲學與程序
            日日狠狠久久偷偷色综合96蜜桃| 久久精品国产色蜜蜜麻豆| 亚洲一区中文字幕久久| 国产激情久久久久影院老熟女| 免费精品久久久久久中文字幕 | 国产精品久久免费| 久久久久久综合一区中文字幕| 热综合一本伊人久久精品| 亚洲精品高清国产一线久久| 草草久久久无码国产专区| 久久夜色精品国产噜噜亚洲a| 久久久久久久久无码精品亚洲日韩| 免费观看久久精彩视频| 亚洲午夜久久久影院| 久久99亚洲综合精品首页| 99久久久精品免费观看国产| 日本亚洲色大成网站WWW久久 | 久久丫精品国产亚洲av不卡| 91精品国产综合久久婷婷 | 亚洲精品乱码久久久久久蜜桃图片 | 996久久国产精品线观看| 国产成年无码久久久免费| 久久久久亚洲精品天堂久久久久久 | 久久国产成人精品麻豆| 一本色综合网久久| 一本色道久久综合| 蜜桃麻豆www久久国产精品| 狠狠精品久久久无码中文字幕| 欧洲人妻丰满av无码久久不卡| 久久国产欧美日韩精品免费| 久久亚洲欧美日本精品| 国产美女久久久| 久久精品国产影库免费看| 精品熟女少妇a∨免费久久| 久久精品国产亚洲AV电影| 亚洲精品国产字幕久久不卡| 久久AV高潮AV无码AV| 国产精品99久久久精品无码| 亚洲精品乱码久久久久久| 99久久人妻无码精品系列蜜桃 | 99久久无码一区人妻|