GetSeparationTree(PlanarGraph pg, PlanarNode src) //1610738 78794 { pg = Triangulation.GetTriangulation(pg); PlanarEdge ww = pg.planarEdges[1630674]; Dictionary <PlanarEdge, int> cyclesTriEdges = new Dictionary <PlanarEdge, int>(); StreamReader r = new StreamReader("C:\\Users\\L\\Desktop\\triCycles.txt"); while (!r.EndOfStream) { string line = r.ReadLine(); string[] spl = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); cyclesTriEdges.Add( pg.planarEdges[int.Parse(spl[0])], int.Parse(spl[0])); } int max = cyclesTriEdges.Values.Max(); KeyValuePair <PlanarEdge, int> maxTriE = cyclesTriEdges.Where(x => x.Value == max).First(); cyclesTriEdges.Remove(maxTriE.Key); SeparatorCycle cycle = new SeparatorCycle(pg); List <PlanarNode> inC; List <PlanarNode> outC; List <PlanarNode> sep = cycle.SeparateByEdge( pg.planarEdges[1630674], pg.planarNodes.First().Value, out inC, out outC); return(null); // DecompositionTreeItem rootIte }
private static void RecursiveSeparation(PlanarGraph pg, PlanarNode src, List <PlanarNode> orderNodes, SeparatorCycle sepCycle) { PlanarEdge sepE; Bfs.Src_all_bfs(src, pg.planarNodes, pg.planarEdges, true); if (pg.planarNodes.Count < nodesCount / 10 || !FindSeparator(src, orderNodes, pg, sepCycle, out sepE)) { Console.WriteLine("Leaf:" + gc + " " + pg.planarNodes.Count); return; } List <PlanarNode> cycleNodes = sepCycle.cycle .Where(x => pg.planarNodes.Keys.Contains(x)) .Select(x => pg.planarNodes[x]).ToList(); gc++; PlanarGraph g0 = new PlanarGraph(sepCycle.inC, cycleNodes, src, new Dictionary <int, PlanarEdge>(pg.planarEdges)); PlanarGraph g1 = new PlanarGraph(sepCycle.outC, cycleNodes, src, new Dictionary <int, PlanarEdge>(pg.planarEdges)); RecursiveSeparation(g0, g0.planarNodes[srcId], orderNodes, sepCycle); gc++; Bfs.Src_all_bfs(src, pg.planarNodes, pg.planarEdges, true); RecursiveSeparation(g1, g1.planarNodes[srcId], orderNodes, sepCycle); }
private static bool FindSeparatorOnTriangulation(PlanarNode src, PlanarGraph pg, SeparatorCycle sepCycle) { pg = Triangulation.GetTriangulation(pg); foreach (PlanarEdge f in Triangulation.triEdges) { if (((PlanarNode)f.neighboursAdjEdges[0]).nid == srcId || ((PlanarNode)f.neighboursAdjEdges[1]).nid == srcId) { continue; } PlanarNode src2 = pg.planarNodes[srcId]; Bfs.Src_all_bfs(src2, pg.planarNodes, pg.planarEdges, true); sepCycle.GetBoundaryCycle(pg, src2, f); int max = (int)(c * pg.planarNodes.Count); if (sepCycle.inC.Count < max && sepCycle.outC.Count < max) { Console.WriteLine(gc + " " + sepCycle.inC.Count); // ResetGraph(pg); return(true); } ResetGraph(pg); // break; } Console.WriteLine("not: " + gc + " " + pg.planarNodes.Count); return(false); }
private static bool FindSeparator(PlanarNode src, List <PlanarNode> orderNodes, PlanarGraph pg, SeparatorCycle sepCycle, out PlanarEdge f) { List <PlanarNode> insideBoundaryNodes = orderNodes .Where(y => pg.planarNodes.ContainsKey(y.nid)).ToList(); for (int i = 0; i < insideBoundaryNodes.Count - 1; i = i + 1) { for (int j = i + 1; j < insideBoundaryNodes.Count; j = j + 1) { PlanarNode src2 = pg.planarNodes[srcId]; Bfs.Src_all_bfs(src2, pg.planarNodes, pg.planarEdges, true); PlanarNode u = pg.planarNodes[insideBoundaryNodes[i].nid]; PlanarNode v = pg.planarNodes[insideBoundaryNodes[j].nid]; f = new PlanarEdge(u, v); f.eid = -pg.planarEdges.Count - 1; f.trgl = true; pg.planarEdges.Add(f.eid, f); u.edgesIds.Add(f.eid); v.edgesIds.Add(f.eid); // SeparatorCycle sepCycle = new SeparatorCycle(); sepCycle.GetBoundaryCycle(pg, src2, f); int max = (int)(c * pg.planarNodes.Count); if (sepCycle.inC.Count < max && sepCycle.outC.Count < max) { Console.WriteLine(gc + " " + sepCycle.inC.Count + " " + u.nid + " " + v.nid); // ResetGraph(pg); return(true); } else { u.edgesIds.Remove(f.eid); v.edgesIds.Remove(f.eid); } ResetGraph(pg); // break; } } f = null; if (c == 4f / 5) { c = 19f / 20; return(FindSeparator(src, orderNodes, pg, sepCycle, out f)); } else { // c = 4f / 5; Console.WriteLine("not: " + gc + " " + pg.planarNodes.Count); return(FindSeparatorOnTriangulation(src, pg, sepCycle)); } }
public static void GetDecompositionTree(PlanarGraph pg, Graph g) { nodesCount = g.nodes.Count(); List <PlanarNode> orderNodes = OrderBoundaryNodes(pg, g, srcId); PlanarNode src = pg.planarNodes[srcId]; // .First().Value; srcId = src.nid; SeparatorCycle sepCycle = new SeparatorCycle(); RecursiveSeparation(pg, src, orderNodes, sepCycle); Console.ReadKey(); }
public static void GetDecomposition(PlanarGraph g, PlanarNode src) { PlanarSeparator sep = new PlanarSeparator(); List <long> cycle; // Bfs.Src_all_bfs(g.planarNodes.First().Value, g.planarEdges, true); SeparatorCycle c = new SeparatorCycle(); c.GetCycle_U_V(g, g.planarNodes[3682132103], g.planarNodes[34073500]); cycle = c.cycle; Dictionary <long, PlanarNode> nodes = new Dictionary <long, PlanarNode>(g.planarNodes); List <long> nullKeys = new List <long>(); foreach (KeyValuePair <long, PlanarNode> pair in nodes) { PlanarNode n = pair.Value; if (n == null || n.edgesIds.Count == 0) { nullKeys.Add(pair.Key); continue; } n.state = 0; n.dist = 0; } foreach (long nid in nullKeys) { nodes.Remove(nid); } foreach (long nid in cycle) { nodes.Remove(nid); } Dictionary <long, List <long> > components = new Dictionary <long, List <long> >(); foreach (PlanarNode x in nodes.Values) { if (x.state > 0) { continue; } // Bfs.Src_all_bfs(x, g.planarEdges, false); List <long> comp = Bfs.part0; components.Add(x.nid, comp); } int max = 0; long maxKey = 0; foreach (KeyValuePair <long, List <long> > pair in components) { if (nodes.ContainsKey(pair.Key) && pair.Value.Count > max) { max = pair.Value.Count; maxKey = pair.Key; } } PlanarNode s0 = nodes.Last().Value; }