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

            我希望你是我獨家記憶

            一段永遠封存的記憶,隨風而去
            posts - 263, comments - 31, trackbacks - 0, articles - 3
               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

            USACO——442——(最大流)

            Posted on 2008-08-15 00:26 Hero 閱讀(127) 評論(0)  編輯 收藏 引用 所屬分類: 代碼如詩--ACM

             

            /*
            ID: wangzha4
            LANG: C++
            TASK: milk6
            */
            /*
               Test 1: TEST OK [0.000 secs, 2740 KB]
               Test 2: TEST OK [0.000 secs, 2740 KB]
               Test 3: TEST OK [0.011 secs, 2740 KB]
               Test 4: TEST OK [0.000 secs, 2740 KB]
               Test 5: TEST OK [0.000 secs, 2740 KB]
               Test 6: TEST OK [0.000 secs, 2740 KB]
               Test 7: TEST OK [0.000 secs, 2736 KB]
               Test 8: TEST OK [0.011 secs, 2740 KB]
               Test 9: TEST OK [0.000 secs, 2736 KB]
               Test 10: TEST OK [0.000 secs, 2740 KB]
               Test 11: TEST OK [0.000 secs, 2740 KB]
               Test 12: TEST OK [0.000 secs, 2736 KB]
            */
            //#define Ndebug

            #include 
            <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #define llong long long

            const int size = 35 ;

            int pren[size] ;//點的前驅
            llong ncap[size] ;//每個點的最大流量(流出量)
            int visit[size] ;//標記該點是否被訪問過
            llong flow[size][size] = {0} ;//邊流量
            int data[1005][3] ;

            int inn, inm ;

            llong num_mincut ;
            //最小割邊的個數
            llong val_mincut ;//最小割的值

            llong fmin( llong a, llong b )
            {
                
            return a < b ? a : b ;
            }

            void input()
            {
                memset( flow, 
            0sizeof(flow) ) ;

                
            forint i=1; i<=inm; i++ )
                {
                    scanf( 
            "%d %d %d"&data[i][0], &data[i][1], &data[i][2] ) ;
                    flow[data[i][
            0]][data[i][1]] += data[i][2* 1001 + 1 ;
                }
            }

            llong findway() 
            {
            //尋找增廣路徑,返回路徑容量(瓶頸容量)
                memset( visit, 0sizeof(visit) ) ;
                memset( ncap,  
            0sizeof (ncap) ) ;

                llong maxncap 
            = 0 ;//最大流量點的流量
                int maxn = -1 ;  //最大流量點的標號
                ncap[1= 999999*99999 ;//初始化原點的流量為無窮大,保證從原點開始尋找

                
            whiletrue )
                {
                    maxncap 
            = 0 ; maxn = -1 ;
                    
            forint i=1; i<=inn; i++ )
                    {
                        
            if!visit[i] && ncap[i]>maxncap )
                        { maxncap 
            = ncap[i] ; maxn = i ; }
                    }
            //找到擁有最大流量且沒有被訪問過的點
                    if-1 == maxn )    return 0 ;//沒有找到增廣路徑
                    if( maxn == inn )    break ;//已經找到新的增廣路徑
                    visit[maxn] = 1 ;//標記這個點已經被訪問過

                    
            forint i=1; i<=inn; i++ )
                    {
            //對maxn的相鄰節點進行權值更新操作
                        if( flow[maxn][i]>ncap[i] && maxncap>ncap[i] )
                        {
            //節點流量為邊流量和路徑流量的最小值
                            ncap[i] = fmin( flow[maxn][i], maxncap ) ;
                            pren[i] 
            = maxn ;//該節點的前驅節點為maxn
                        }
                    }
                }
            //while(true)

                maxncap 
            = ncap[inn] ;//路徑流量即為匯點的流量

                
            forint i=inn; i>1; i=pren[i] )
                {
                    flow[pren[i]][i] 
            -= maxncap ;//正向邊 - 路徑容量
                    flow[i][pren[i]] += maxncap ;//反向邊 + 路徑容量
                }

                
            return maxncap ;
            }

            void DFS_sn( int sn )
            {
                visit[sn] 
            = 1 ;

                
            forint i=1; i<=inn; i++ )
                {
                    
            if!visit[i] && flow[sn][i]>0 )    DFS_sn( i ) ;
                }
            }


            void process()
            {
                llong maxflow 
            = 0 ; llong addflow ;

                
            while( ( addflow = findway() ) != 0 )
                {
            //當路徑容量不為0
                    maxflow += addflow ;
                }

                val_mincut 
            = maxflow/1001 ;
                num_mincut 
            = maxflow - (llong)(maxflow/1001)*1001 ;
                printf( 
            "%lld %lld\n", val_mincut, num_mincut ) ;

                
            //find_mincut() ;
                
            }

            void output()
            {
                
            if1 == num_mincut )
                {
                    
            forint i=1; i<=inm; i++ )
                    {
                        
            if( val_mincut == data[i][2] )    
                        { printf( 
            "%d\n", i ) ; return ; }
                    }
                }

                memset( visit, 
            0sizeof(visit) ) ;
                DFS_sn( 
            1 ) ;//
                forint i=1; i<=inm; i++ )
                {
                    
            if( visit[data[i][0]] && !visit[data[i][1]] ) {
                        printf( 
            "%d\n", i ) ;
                    }
                }
            }

            int main()
            {
            #ifndef Ndebug
                freopen( 
            "milk6.in""r", stdin ) ;
                freopen( 
            "milk6.out","w",stdout ) ;
            #endif

            #ifdef Ndebug
                freopen( 
            "in.txt""r", stdin ) ;
                freopen( 
            "out.txt""w", stdout ) ;
            #endif

                
            while( scanf( "%d %d"&inn, &inm ) != EOF )
                {
                    input() ;

                    process() ;

                    output() ;

                }
            //while

                
            return 0 ;
            }
            久久人人爽人人爽人人片AV高清 | 91精品国产91久久久久久蜜臀| 无码国产69精品久久久久网站| 精品国产一区二区三区久久久狼 | 久久免费视频1| 亚洲精品高清国产一线久久| 激情伊人五月天久久综合| 国产成人久久777777| 99久久精品国产一区二区 | 国产ww久久久久久久久久| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产成人精品综合久久久久| 久久久青草久久久青草| 一本色综合久久| 国产精品嫩草影院久久| 国产美女亚洲精品久久久综合| 97久久精品国产精品青草| 青青热久久国产久精品| AV无码久久久久不卡蜜桃| 狠狠色丁香久久婷婷综合图片| 色噜噜狠狠先锋影音久久| 2021国内久久精品| 精品99久久aaa一级毛片| 色婷婷综合久久久中文字幕| 亚洲综合久久久| 99热都是精品久久久久久| 97久久超碰国产精品2021| 亚洲中文字幕无码久久2020| 亚洲精品国精品久久99热| 久久一本综合| 久久久久亚洲精品中文字幕| 99久久精品国产一区二区蜜芽 | 欧美久久久久久午夜精品| 日韩精品久久久久久| 99久久精品国产一区二区蜜芽| 国产精品视频久久| 国产精品久久国产精品99盘| 狠狠干狠狠久久| 色综合合久久天天综合绕视看| 国内精品久久久久| 狠狠色综合久久久久尤物|