最大流算法完整代碼

看過的最大流算法中,薛超英教授的《數據結構》第5章應該是講的比較易懂的,裏面沒有一開始就上來一堆符號。在線閱讀地址:html

http://max.book118.com/html/2012/0630/2313684.shtmios

http://www.doc88.com/p-407189007451.html算法

書中提供的算法屬於未經優化的Ford-Fulkerson算法,能夠學會此方法後再學習其餘方法。算法原理是:數據結構

Ford-Fulkerson 方法 (G,s,t)
1 將各邊上流量 f 初始化爲 0
2 while 存在一條增廣路徑 p
3     do 沿路徑 p 增廣流量 f
4 return f

上面提到的書寫的很通俗,可是我的感受有個問題是第5章圖算法安排的位置有點靠前。另外做者是學院派寫代碼有2點很差的地方:一是常常用單個字母命名變量,這樣帶來的最大問題是當用Ctrl+F查找變量時,難以查找;二是比較喜歡用do-while循環,可讀性沒有for好。另外我寫算法喜歡把輸入數據直接寫在初始化代碼中,便於檢查算法效果和調試。學習

下面是根據書中算法寫的代碼:優化

#include<iostream>
#include<cmath>
using namespace std;

const int SCALE=6;
int matrix[SCALE][SCALE]={0};
int flow[SCALE][SCALE]={0};
int stk[SCALE]={0};

void init()
{
    matrix[0][1]=4;
    matrix[1][2]=4;
    matrix[2][3]=2;
    matrix[4][3]=6;
    matrix[4][5]=9;
    matrix[0][2]=8;
    matrix[2][4]=2;
    matrix[3][5]=7;
    matrix[1][3]=4;
    matrix[1][4]=1;
}

int findPath()
{
    int mark[SCALE];
    for(int i=0;i<SCALE;i++)mark[i]=0;

    int top=0;
    stk[top]=0;
    mark[top]=1;

    while(top>=0)
    {
        int current=abs(stk[top]);
        int i=0;
        for(i=0;i<SCALE;i++)
        {
            if(mark[i]==0)
            {
                if(matrix[current][i]>flow[current][i])
                {
                    top+=1;
                    stk[top]=i;
                    mark[i]=1;

                    if(i==(SCALE-1))
                    {
                        return top;
                    }
                    break;
                }
                else if(flow[i][current]>0)
                {
                    top+=1;
                    stk[top]=(-i);
                    mark[i]=1;
                    break;
                }
            }
        }
        if(i==SCALE)
        {
            top=top-1;
        }
    }
    return 0;
}

void update(int top)
{
    int addValue=65535;
    for(int i=1;i<=top;i++)
    {
        int temp=0;
        int first=abs(stk[i-1]);
        int second=abs(stk[i]);

        if(stk[i]>0)
        {
            temp=matrix[first][second] - flow[first][second];
        }
        else
        {
            temp=flow[second][first];
        }

        if(addValue>temp)
        {
            addValue=temp;
        }
    }


    for(int i=1;i<=top;i++)
    {
        int first=abs(stk[i-1]);
        int second=abs(stk[i]);

        if(stk[i]>0)
        {
            flow[first][second] = flow[first][second]+addValue;
        }
        else
        {
            flow[second][first] = flow[second][first]-addValue;
        }
    }

}

int maxFlow()
{
    int val=0;
    while((val=findPath())>0)update(val);

    int maxVolumn=0;
    for(int i=1;i<SCALE;i++)
    {
        maxVolumn += flow[0][i];
    }

    return maxVolumn;
}

int main()
{
    init();

    cout<<maxFlow();

    return 0;
}
相關文章
相關標籤/搜索