Beispiel #1
0
        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;
        }
Beispiel #2
0
        public void DirectedCycleTest()
        {
            var g   = DigraphSample();
            var dfs = new DirectedCycle(g);

            Assert.True(dfs.HasCycle());
        }
Beispiel #3
0
    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();
            }
        }
Beispiel #7
0
        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();
        }
    }
Beispiel #9
0
    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();
            }
        }
Beispiel #12
0
        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);
            }
        }
Beispiel #13
0
        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!");
            }
        }
Beispiel #14
0
    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++;
            }
        }
    }
Beispiel #15
0
        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();
            }
        }
Beispiel #16
0
        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);
            }
        }
Beispiel #18
0
    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");
        }
    }
Beispiel #20
0
        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();
        }