private void FindNegtiveCycle() { int V = edgeTo.Length;//图的节点数量 DirectedWeightedGraph spt = new DirectedWeightedGraph(V); for (int v = 0; v < V; ++v) { if (edgeTo[v] != null) { spt.AddEdge(edgeTo[v]); } } DirectedCycle cf = new DirectedCycle(spt); //需要转换形式 Queue <DirectedEdge> edges = new Queue <DirectedEdge>();//没有还 var list = cf.Cycle().ToList(); if (list.Count == 0) { return; } for (int i = 0; i < list.Count - 1; ++i) { edges.Enqueue(new DirectedEdge(list[i], list[i + 1], spt.GetWeight(list[i], list[i + 1]))); } cycle = edges; }
public void DirectedCycleTest() { var g = DigraphSample(); var dfs = new DirectedCycle(g); Assert.True(dfs.HasCycle()); }
void DigraphTest() { Digraph r = new Digraph(7); r.AddEdge(0, 1); r.AddEdge(1, 2); r.AddEdge(3, 1); r.AddEdge(1, 4); r.AddEdge(4, 5); r.AddEdge(4, 6); r.AddEdge(6, 0); //r.Display(); Digraph reverse = r.Reverse(); //reverse.Display(); DirectedDFS d = new DirectedDFS(r, 1); //d.Display(); DirectedCycle c = new DirectedCycle(r); //Debug.Log(c.HasCycle()); //c.Cycle(); //DepthFirstOrder o = new DepthFirstOrder(r); //o.Pre(); KosarajuSCC scc = new KosarajuSCC(r); Debug.Log(scc.Connected(0, 4)); }
public Topological_Queue(IDirectedGraph g) { DirectedCycle directedCycle = new DirectedCycle(g); if (!directedCycle.HasCycle()) { //DAG solve(g); } }
public Topological(DirectedGraph graph) { var cycleFinder = new DirectedCycle(graph); if (!cycleFinder.HasCycle()) { var depthFirstOrder = new DepthFirstOrder(graph); order = depthFirstOrder.ReversePost(); } }
public Topological(Digraph d) { DirectedCycle directedCycle = new DirectedCycle(d); if (!directedCycle.hasCycle()) { DepthFirstOrder depthFirstOrder = new DepthFirstOrder(d); this.order = depthFirstOrder.reversePost(); } }
public TopologicalSort(IDigraph g) { var cycleDirected = new DirectedCycle(g); if (!cycleDirected.HasCycle) { var dfs = new DepthFirstOrder(g); _order = dfs.ReversePost; } }
public Topological(DirectedGraph g) { DirectedCycle cycleFinder = new DirectedCycle(g); if (!cycleFinder.HasCycle()) { DepthFirstOrder dfs = new DepthFirstOrder(g); m_order = dfs.ReversePost(); } }
public Topological(Digraph g) { DirectedCycle cycle = new DirectedCycle(g); if (!cycle.HasCycle()) { DepthFirstOrder dfs = new DepthFirstOrder(g); order = dfs.Pre(); } }
public TopologicalAOE(IDirectedGraph g) { DirectedCycle directedCycle = new DirectedCycle(g); if (!directedCycle.HasCycle()) { m_ve = new int[g.V]; //DAG solve(g); } }
private IEnumerable <int> order;//顶点的拓扑排序 public Topological(IDirectedGraph g) { DirectedCycle directedCycle = new DirectedCycle(g); if (!directedCycle.HasCycle()) { //DAG DepthFirstOrder dfs = new DepthFirstOrder(g); order = dfs.ReversePost(); } }
public void HasCycleTest() { using (StreamReader sr = new StreamReader(@"E:\Study\ALG2017\ALGRKC\dataSelf\tinyDG.txt")) { Digraph dg = new Digraph(sr); DirectedCycle dcycle = new DirectedCycle(dg); Assert.AreEqual(dcycle.HasCycle(), true); } }
private IEnumerable <int> order;//顶点的拓扑排序 public Topological(IDirectedGraph g) { DirectedCycle directedCycle = new DirectedCycle(g); if (!directedCycle.HasCycle()) { //DAG DepthFirstOrder dfs = new DepthFirstOrder(g); order = dfs.ReversePost(); } else { // throw new ArgumentException("不是 DAG!"); } }
private int[] rank; // rank[v] = position of vertex v in topological order public Topological(Digraph G) { DirectedCycle finder = new DirectedCycle(G); if (!finder.hasCycle()) { DepthFirstOrder dfs = new DepthFirstOrder(G); order = dfs.reversePost(); rank = new int[G.V()]; int i = 0; foreach (int v in order) { rank[v] = i++; } } }
public void CycleTest() { using (StreamReader sr = new StreamReader(@"E:\Study\ALG2017\ALGRKC\dataSelf\tinyDG.txt")) { Digraph dg = new Digraph(sr); DirectedCycle dcycle = new DirectedCycle(dg); Assert.AreEqual(dcycle.HasCycle(), true); IEnumerable <int> cycle = dcycle.Cycle(); foreach (int i in cycle) { Console.Write(i + " -> "); } Console.WriteLine(); } }
void DigraphTest() { //var strArr = FileHandler.ReadFileAsStrArr("tinyG.txt"); //var strArr = FileHandler.ReadFileAsStrArr("tinyDG.txt"); var strArr = FileHandler.ReadFileAsStrArr("tinyDAG.txt"); var intArr = Array.ConvertAll(strArr, s => int.Parse(s)); var dg = new Digraph(intArr); //var dgr = dg.Reverse(); var dc = new DirectedCycle(dg); if (dc.HasCycle()) { foreach (var v in dc.Cycle()) { Console.WriteLine(v); } } Console.ReadKey(); }
//public bool CreateGrapByBlkObjects(out string error) //{ // error = null; // try // { // _graph = new Digraph(_blockingObjects.Length + _threads.Length); // for (int i = 0, icnt = _blockingObjects.Length; i < icnt; ++i) // { // ClrtBlkObject blk = _blockingObjects[i]; // if (blk.Owner != Constants.InvalidIndex) _graph.AddDistinctEdge(i,blk.Owner+_threadNdxStart); // for (int j = 0, jcnt = blk.Owners.Length; j < jcnt; ++j) // { // _graph.AddDistinctEdge(i, blk.Owners[j] + _threadNdxStart); // } // for (int j = 0, jcnt = blk.Waiters.Length; j < jcnt; ++j) // { // _graph.AddDistinctEdge(blk.Waiters[j] + _threadNdxStart,i); // } // } // List<KeyValuePair<int,int[]>> waitList = new List<KeyValuePair<int, int[]>>(_threads.Length/2); // List<int> blkList = new List<int>(); // for (int i = 0, icnt = _threads.Length; i < icnt; ++i) // { // ClrtThread thrd = _threads[i]; // if (thrd.BlockingObjects.Length < 1) continue; // blkList.Clear(); // for (int j = 0, jcnt = thrd.BlockingObjects.Length; j < jcnt; ++j) // { // blkList.Add(thrd.BlockingObjects[j]); // } // waitList.Add(new KeyValuePair<int, int[]>(i,blkList.ToArray())); // } // _threadWaitingLists = waitList.Count > 0 ? waitList.ToArray() : Utils.EmptyArray<KeyValuePair<int, int[]>>.Value; // return true; // } // catch (Exception ex) // { // error = Utils.GetExceptionErrorString(ex); // return false; // } //} public bool HasCycle(out string error) { error = null; try { DirectedCycle dcycle = new DirectedCycle(_graph); if (dcycle.HasCycle()) { var threadNdxStart = _blockingObjects.Length; _cycle = dcycle.GetCycle(); return(true); } _cycle = Utils.EmptyArray <int> .Value; return(false); } catch (Exception ex) { error = Utils.GetExceptionErrorString(ex); return(false); } }
void Start() { Digraph G = new Digraph(txt); DirectedCycle finder = new DirectedCycle(G); if (finder.hasCycle()) { string str = "Directed cycle: "; foreach (int v in finder.Cycle()) { str += (v + " "); } print(str); } else { print("No directed cycle"); } }
/**/ public static void main(string[] strarr) { In i = new In(strarr[0]); Digraph d = new Digraph(i); DirectedCycle directedCycle = new DirectedCycle(d); if (directedCycle.hasCycle()) { StdOut.print("Cycle: "); Iterator iterator = directedCycle.cycle().iterator(); while (iterator.hasNext()) { int i2 = ((Integer)iterator.next()).intValue(); StdOut.print(new StringBuilder().append(i2).append(" ").toString()); } StdOut.println(); } else { StdOut.println("No cycle"); } }
public void Run() { Console.WriteLine("Choose file:"); // Prompt Console.WriteLine("1 - tinyDG.txt"); // Prompt Console.WriteLine("2 - tinyDAG.txt"); // Prompt //Console.WriteLine("3 - largeG.zip"); // Prompt Console.WriteLine("or quit"); // Prompt var fileNumber = Console.ReadLine(); var fieName = string.Empty; switch (fileNumber) { case "1": fieName = "tinyDG.txt"; break; case "2": fieName = "tinyDAG.txt"; break; //case "3": // fieName = "largeG.zip"; // break; case "quit": return; default: return; } var @in = new In($"Files\\Graphs\\{fieName}"); var lines = !fieName.EndsWith("zip") ? @in.ReadAllLines() : @in.ReadAllLinesFromZip(); var lineIterator = 0; var v = 0; var e = 0; var edges = new List <EdgeD>(); foreach (var line in lines) { if (lineIterator == 0) { v = Convert.ToInt32(line); } if (lineIterator == 1) { e = Convert.ToInt32(line); } if (lineIterator > 1) { var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var ve = Convert.ToInt32(lineSplitted[0]); var we = Convert.ToInt32(lineSplitted[1]); var edge = new EdgeD(ve, we); edges.Add(edge); } lineIterator++; } var graph = new Digraph(v, e, edges); if (fileNumber != "3") { Console.WriteLine(graph); } var finder = new DirectedCycle(graph); if (finder.HasCycle()) { Console.Write("Directed cycle: "); foreach (int vi in finder.Cycle()) { Console.Write($"{vi} "); } Console.WriteLine(); } else { Console.WriteLine("No directed cycle"); } Console.ReadLine(); }