Ejemplo n.º 1
0
        public static int GetMinCut(DirectedGraph<int> graph)
        {
            var nodes = new List<MergedNode>();
            var edges = new List<Edge>();
            foreach (var node in graph.Keys)
            {
                nodes.Add(new MergedNode(node));
                edges.AddRange(graph.GetOutNodes(node).Select(x => new Edge(node, x)));
            }

            var random = new Random();

            while (nodes.Count > 2)
            {
                var edgeIndex = random.Next(edges.Count);
                var edge = edges[edgeIndex];
                var node1 = nodes.First(node => node.Nodes.Contains(edge.From));
                var node2 = nodes.First(node => node.Nodes.Contains(edge.To));
                edges.RemoveAt(edgeIndex);
                if (node1 == node2)
                {
                    continue;
                }

                nodes.Remove(node1);
                nodes.Remove(node2);
                nodes.Add(node1.Merge(node2));
            }

            return GetCrossingEdgesCount(nodes[0], nodes[1], graph);
        }
Ejemplo n.º 2
0
 public static int GetCrossingEdgesCount(MergedNode node1, MergedNode node2, DirectedGraph<int> graph)
 {
     return node1.Nodes.Sum(n1 => node2.Nodes.Count(n2 => graph.GetOutNodes(n1).Contains(n2)));
 }