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

            杰 & C++ & Python & DM

            圖論最大網(wǎng)絡(luò)流(一) POJ 1273 解題報(bào)告

                    題目鏈接http://acm.pku.edu.cn/JudgeOnline/problem?id=1273
                    本題是最大流算法的簡(jiǎn)單應(yīng)用。
                    最大網(wǎng)絡(luò)流的基本思想很簡(jiǎn)單——從某個(gè)初始流開始,反復(fù)的增加流的流量知道不能再改進(jìn)為止。最后得到的流將是一個(gè)最大流。
                    定理 設(shè) P 是網(wǎng)絡(luò) G 中從起點(diǎn)到終點(diǎn)滿足一下條件的一條路徑:
                              (a) 對(duì)P中的每條正向邊(i,j)Fij   <  Cij
                             
                            (b)對(duì)P中的每條反向邊(i,j)Fij    >  0
                             設(shè) D是由P中所有正向邊(i,j)對(duì)應(yīng)的數(shù)和P中所有反向邊(i,j)對(duì)應(yīng)的數(shù)組成。
                                      Δ =min D
                     
                                                           Fij                   如果(i,j)不在P中
                                 F*ij={  FijΔ  如果(i,j)在P中且是正向的
                           Fij-Δ   如果(i,j)在P中且不是正向的


               根據(jù)上述定理,如果找不到路徑滿足上述定理,那么得到的流便是最大的。我們可以構(gòu)造一個(gè)算法:
               1.從一個(gè)流開始;
               2.尋找一個(gè)滿足上述定理的路徑,如果這樣的路徑不存在,則停止,流是最大的;
               3.將流過這條路徑的流量增加△,轉(zhuǎn)到第2行。
               Ford-Fulkerson方法是按照上述定理構(gòu)造,解決最大流問題的有效方法,一般采用深搜策略;而Edmonds-Karp算法是Ford-Fulkerson方法的廣搜的實(shí)現(xiàn);相對(duì)而言,后者的效率稍微高一些。
                    
                  下面是POJ 1273的代碼,采用的是Edmonds-Karp算法。
               

             1#include <cstdio>
             2#include <queue>
             3const int INF=0x0fffffff;
             4const int SIZE=202;
             5
             6int bfs(int (*mat)[SIZE],int start,int end,int* path)
             7{
             8    int flow[SIZE];//存儲(chǔ)一次BFS遍歷之后流的可改進(jìn)量;
             9    std::queue<int> q;
            10    int i;
            11    
            12    for(i=0;i<SIZE;++i)
            13        path[i]=-1;
            14    path[start]=0,flow[start]=INF;
            15
            16    q.push(start);
            17    while(!q.empty())
            18    {
            19        int top=q.front();
            20        q.pop();
            21        if(top==end) break;
            22        for(i=1;i<=end;++i)
            23        {
            24            if(i != start && path[i]==-1 && mat[top][i])
            25            {
            26                flow[i]=flow[top]<mat[top][i] ? flow[top] : mat[top][i];
            27                q.push(i);
            28                path[i]=top;
            29            }

            30        }

            31    }

            32    if(path[end]==-1return -1;
            33    return flow[end];
            34
            35
            36}

            37int Edmonds_Karp(int (*mat)[SIZE],int start,int end)
            38{
            39    int maxflow=0,step,cur,pre;
            40    int path[SIZE];    ////存儲(chǔ)當(dāng)前已訪問過的節(jié)點(diǎn)的增廣路徑;
            41    while((step=bfs(mat,start,end,path)) != -1)//找不到增廣路徑時(shí)退出
            42    {
            43        maxflow += step;
            44        cur=end;
            45        while(cur != start)
            46        {
            47            pre=path[cur];
            48            mat[pre][cur] -= step;    //更新正向邊的實(shí)際容量
            49            mat[cur][pre] += step;    //添加反向邊
            50            cur=pre;
            51        }

            52    }

            53    return maxflow;
            54}

            55
            56int main()
            57{
            58    int mat[SIZE][SIZE];
            59    int vecNum,edgeNum;
            60    int i;
            61    int a,b,c;
            62    
            63    while(scanf("%d%d",&edgeNum,&vecNum)!=EOF)
            64    {
            65        memset(mat,0,sizeof(mat));
            66        for(i=0;i<edgeNum;++i)
            67        {
            68            scanf("%d%d%d",&a,&b,&c);
            69            mat[a][b]+=c;
            70        }

            71        
            72        int re=Edmonds_Karp(mat,1,vecNum);
            73        printf("%d\n",re);
            74
            75    }

            76    return 0;    
            77}

            78

             


             

            posted on 2009-04-26 19:18 jaysoon 閱讀(968) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACM/ICPC

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            收藏夾

            C++

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久国产一级毛片高清版| 国产精品一久久香蕉国产线看| 久久国产高清字幕中文| 看久久久久久a级毛片| 亚洲精品美女久久久久99小说| 理论片午午伦夜理片久久| Xx性欧美肥妇精品久久久久久| 久久99国产精一区二区三区| 久久久久久狠狠丁香| 国产精品熟女福利久久AV| 久久九九免费高清视频| 久久久久人妻精品一区三寸蜜桃| 久久AⅤ人妻少妇嫩草影院| 人人狠狠综合久久亚洲88| 91久久香蕉国产熟女线看| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久婷婷五月综合国产尤物app| 色欲综合久久躁天天躁| 久久亚洲AV无码精品色午夜| 久久精品无码专区免费东京热 | 久久香综合精品久久伊人| 国产精品久久久久久久久鸭| 精品无码久久久久久久久久| 久久久这里只有精品加勒比| 日韩精品无码久久久久久| 久久se精品一区二区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久人人爽人人爽人人片AV东京热| 久久激情五月丁香伊人| 久久婷婷色综合一区二区| 久久久久久久尹人综合网亚洲 | 精品国际久久久久999波多野| 99热成人精品免费久久| 99精品久久久久久久婷婷| 久久91精品国产91久久小草| 综合久久精品色| 国内精品人妻无码久久久影院导航 | 91精品国产高清久久久久久io | 久久无码专区国产精品发布 | A狠狠久久蜜臀婷色中文网| 久久久久久毛片免费看|