关于什么是最大流。我说不清楚,而且也没有别人的比喻生动。
【主要是我懒,不想画图】
算法的核心在于:找到增广路径,修改它,继续找,直到没有。
While ( findAugmentPath() ) // 判断是否有增广路 maxFlow = maxFlow + delta // 最大流增加 modifyGraph() // 对增广路进行修改 End While
最近智商有点不够用。想了很久才想通findAugmentPath()函数。
利用的是BFS。
1 int i,j,u,v; 2 int flag=0; 3 for(i=0;i<n;i++) 4 { 5 queue[i]=0;//bfs算法的队列 6 visited[i]=0;//是否被访问 7 path[i]=0;//保存走过的路 8 capacity[i]=0;//最大流 9 }//初始化 10 int tail=0;//tail标记此时bfs到哪个地方了 11 queue[tail]=0; 12 capacity[0]=inf; 13 visited[0]=1; 14 i=0; 15 while(i<=tail) 16 { 17 u=queue[i]; 18 if(u==n-1)//如果目的点入队说明存在增广路径 19 { 20 flag=1; 21 return capacity[n-1]; 22 23 } 24 25 for(v=0;v<n;v++)//bfs 26 { 27 if(r[u][v]>0&&r[u][v]!=inf&&visited[v]==0) 28 { 29 //cout<<v<<endl; 30 path[v]=u; 31 capacity[v]=min(r[u][v],capacity[u]); 32 visited[v]=true; 33 tail=tail+1; 34 queue[tail]=v; 35 } 36 37 } 38 i++; 39 }
我在想如果只是需要找到一条增广路径,然后修改它,dfs算法也可以。【于是给自己挖了一个坑】
对增广路径的修改,就是找到了某一个路径的最大流,然后经过的路径全部减去这个最大流,意思是下次这里不通了。
1 void modifyGraph() 2 { 3 int flow=capacity[n-1]; 4 int now=n-1; 5 while(now!=0) 6 { 7 int fa=path[now]; 8 r[fa][now]=r[fa][now]-flow; 9 // r[now][fa]=r[now][fa]+flow; 10 now=fa; 11 12 } 13 }