Пример #1
0
        public void AddEdge(int from, int to, long capacity)
        {
            if (capacity <= 0)
            {
                throw new ArgumentException("Forward edge capacity should be greater than 0");
            }

            var e1 = new FlowEdge(from, to, capacity);
            var e2 = new FlowEdge(to, from, 0);

            e1.Residual = e2;
            e2.Residual = e1;
            Graph[from].Add(e1);
            Graph[to].Add(e2);
        }
Пример #2
0
        private long Bfs()
        {
            var q = new Queue <int>();

            Visit(Source);
            q.Enqueue(Source);

            var prev = new FlowEdge[NumberOfNodes];

            while (q.Count > 0)
            {
                var node = q.Dequeue();
                if (node == Sink)
                {
                    break;
                }
                foreach (var edge in Graph[node])
                {
                    var capacity = edge.RemainingCapacity;
                    if (capacity > 0 && !HasBeenVisited(edge.To))
                    {
                        Visit(edge.To);
                        prev[edge.To] = edge;
                        q.Enqueue(edge.To);
                    }
                }
            }

            if (prev[Sink] == null)
            {
                return(0);
            }
            var bottleNeck = long.MaxValue;

            for (var edge = prev[Sink]; edge != null; edge = prev[edge.From])
            {
                bottleNeck = Math.Min(bottleNeck, edge.RemainingCapacity);
            }

            for (var edge = prev[Sink]; edge != null; edge = prev[edge.From])
            {
                edge.Augment(bottleNeck);
            }

            return(bottleNeck);
        }