最大流通路

摘要:将每条边看成容量,寻找起始点到每一个点的能通过的最大值.

(1)基本思路:

[1]基本思路还是Dijkstra算法,首先将起始点的相邻点遍历一遍,找到起始点到该节点容量最大的一个,将它标记为已知.
[2]在所有未知节点里面重复[1]的过程,每找到一个节点,都要访问它所有的邻接节点,并且更新距离,如果连接两个节点的边的容量比起始点到已知节点的最大容量要小,那么就要更新该容量.
[3]直到所有节点被访问.

(2)证明该算法的合理性:

【1】首先第一个已知节点一定是起始到该节点的最大通路,因为如果存在一条其余通路,那么必然经过其他的邻接节点,而这些节点的边容量都小于第一个已知节点,那么根据最大通路的容量是该通路上所有边容量最小值的概念,这条通路的容量必然小于已知通路。
[2]假设第1-k个节点找到的通路都是最小通路,现在节点k+1是所有未知节点中容量最大的,那么它此刻的容量就应该时最大流量.假设存在一条通路流量比该节点还要大,那么这条通路上所有的节点流量都应该大于节点K+1,那么根据算法就不会选择节点k+1了.
int FindMaxunknown(Table T)
{
    int max = 0,index;
    for (int i = 0;i<=Number-1;i++)
    {
        if (T[i].known!=true&&T[i].distance >= max)
        {
                max = T[i].distance;
                index = i;
        }
    }
    return index;
    }
void FindMaxRoute(Table T,int start)
{
    //最大流
    int v,w,cw,counter = 0;
    while(counter <=Number-1)
    {

        //找到最大未知节点
        v = FindMaxunknown(T);
        T[v].known = true;
        T[v].Header = T[v].Header->Next;
        counter++;//处理好的元素个数加1;
    while(T[v].Header!=NULL)
    {

        w = T[v].Header->Element;
        cw = T[v].Header->weight;
        if(T[w].known != true)//最大流问题是选择能通过的最大
        {
            //更新
            T[w].distance = cw < T[v].distance?cw:T[v].distance;
            T[w].path = v;
        }
        T[v].Header = T[v].Header->Next;
    }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值