摘要:将每条边看成容量,寻找起始点到每一个点的能通过的最大值.
(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++;
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;
}
}
}