最大流(二)---樸素算法

https://www.cnblogs.com/fzl194/p/8855101.html

package graphModel;

import java.util.Arrays;
import java.util.LinkedList;

public class FordFulkson {
    public static int inf = 1000;// 表示兩點之間不連接
    public static int maxn = 1000;// 節點預分配的最大個數,防止越界

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int N = 6;//實際節點個數
        int S = 0;
        int T = N-1;
        
        int[][] dag = { { 0, 8, inf, 7, inf, inf }, { inf, 0, 9, 5, inf, inf }, { inf, inf, 0, 2, inf, 5 },
                { inf, inf, inf, 0, 9, inf }, { inf, inf, 6, inf, 0, 10 }, { inf, inf, inf, inf, inf, 0 } };
        Graph graph = new Graph();
        graph.initSolveMaxFlow(dag);
        Graph.Edge[] edges = graph.getEdges();
        int[] head = graph.getHead();
        
        int flow = 0;
        int[] flowNodes = new int[maxn];//每個點目前分配的流量
        int[] preNode = new int[maxn];//p[i]從原點s到終點t的節點i的前一條邊的編號
        Arrays.fill(preNode, -1);
        while(true) {
            //每輪迭代,每個節點在本輪分配的流量初始化爲0
            Arrays.fill(flowNodes, 0);
           // Arrays.fill(preNode, -1);
            LinkedList<Integer> queue = new LinkedList<>();
            queue.add(S);
            flowNodes[S]=inf;
            while(!queue.isEmpty()) {
                int curNode = queue.poll();
                for(int i=head[curNode];i!=-1;i=edges[i].next) {
                    int to = edges[i].to;
                    if( flowNodes[to]==0 && edges[i].w>0) {
                        int tmp = Math.min(flowNodes[curNode], edges[i].w);
                        flowNodes[to] +=tmp;
                        preNode[to]=curNode;
                        queue.add(to);
                    }
                    
                }
                if(flowNodes[T]!=0)
                    break;//如果已經流到了終點t,退出本次找增廣路
            }
            if(flowNodes[T]==0)
                break;//如果所有路都已經試過,水不能流到終點,說明已經沒有增廣路,已經是最大流   
            //分配流量
         
            for(int i=T; i!=S;i=preNode[i]) {
                int u = preNode[i];
                int v=i;
                for(int j=head[u];j!=-1;j=edges[j].next) {
                    if(edges[j].to == v) {
                        edges[j].w-=flowNodes[T];
                        edges[j+1].w+=flowNodes[T];
                    }
                    
                }
            }
            flow = flow+flowNodes[T];
        }
        System.out.println(flow);

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章