Exemplo n.º 1
0
        public void SpawnTarjan(Mobile target)
        {
            Map map     = this.Map;
            int nTarjan = 0;

            if (map == null)
            {
                return;
            }

            ArrayList tarjans = new ArrayList();

            foreach (Mobile tarj in World.Mobiles.Values)
            {
                if (tarj is Tarjan)
                {
                    nTarjan = 1;
                }
            }

            if (nTarjan == 0)
            {
                BaseCreature monster = new Tarjan();
                Point3D      loc     = this.Location;
                monster.PlaySound(0x216);
                monster.MoveToWorld(loc, map);
                monster.Combatant = target;
            }
        }
        public void LargerSimpleCycleWithBlindEnd2()
        {
            var a = new StringTarjanNode("A");
            var b = new StringTarjanNode("B", a);
            var c = new StringTarjanNode("C", b);
            var d = new StringTarjanNode("D", c);

            a.Neighbors.Add(d);

            var e = new StringTarjanNode("E", c);

            var underTest = new Tarjan(a, b, c, d, e);

            Assert.That(underTest.ResultSets.Count, Is.EqualTo(2));
            var first = underTest.ResultSets.First();
            var last  = underTest.ResultSets.Last();
            var large = first.Count > last.Count ? first : last;
            var small = first.Count > last.Count ? last : first;

            Assert.That(large.Count == 4);
            Assert.That(small.Count == 1);
            Assert.That(large.Contains(a));
            Assert.That(large.Contains(b));
            Assert.That(large.Contains(c));
            Assert.That(large.Contains(d));
            Assert.That(small.Contains(e));
        }
Exemplo n.º 3
0
        void EnsureGraphIsAcyclic()
        {
            var tarjan = new Tarjan <T, DependencyGraphNode <T> >(_adjacencyList);

            if (tarjan.Result.Count == 0)
            {
                return;
            }

            var message = new StringBuilder();

            foreach (var cycle in tarjan.Result)
            {
                message.Append("(");
                for (int i = 0; i < cycle.Count; i++)
                {
                    if (i > 0)
                    {
                        message.Append(",");
                    }

                    message.Append(cycle[i].Value);
                }
                message.Append(")");
            }

            throw new InvalidOperationException("The dependency graph contains cycles: " + message);
        }
Exemplo n.º 4
0
        public void TwoNodes()
        {
            var a = new StringTarjanNode("A");
            var b = new StringTarjanNode("B");

            a.Neighbors.Add(b);

            var underTest = new Tarjan(a, b);

            Assert.That(underTest.ResultSets.Count, Is.EqualTo(2));
        }
Exemplo n.º 5
0
        public void WithoutArcs()
        {
            UnweightedGraphMatrix graph = new UnweightedGraphMatrix(true, 5);

            int[] result = Tarjan.Run(graph);

            Assert.AreEqual(5, result.Length);
            Assert.AreEqual(0, result[0]);
            Assert.AreEqual(1, result[1]);
            Assert.AreEqual(2, result[2]);
            Assert.AreEqual(3, result[3]);
            Assert.AreEqual(4, result[4]);
        }
Exemplo n.º 6
0
        public void ThreePeaks()
        {
            WeightedGraphMatrix <int> graph = new WeightedGraphMatrix <int>(true, 3);

            graph.AddArc(1, 0, 2);
            graph.AddArc(1, 2, 3);

            graph.AddArc(0, 2, 4);

            Assert.AreEqual(1, Tarjan.Run(new UnweightedGraphWrapper <int>(graph))[0]);
            Assert.AreEqual(0, Tarjan.Run(new UnweightedGraphWrapper <int>(graph))[1]);
            Assert.AreEqual(2, Tarjan.Run(new UnweightedGraphWrapper <int>(graph))[2]);
        }
        public void SimpleCycle()
        {
            var a = new StringTarjanNode("A");
            var b = new StringTarjanNode("B", a);

            a.Neighbors.Add(b);

            var underTest = new Tarjan(a, b);

            Assert.That(underTest.ResultSets.Count, Is.EqualTo(1));
            Assert.That(underTest.ResultSets.First().Contains(a));
            Assert.That(underTest.ResultSets.First().Contains(b));
        }
        public IEnumerable <Cycle> FindCycles()
        {
            var algo = new Tarjan();

            foreach (var cycle in algo.FindCycles(this))
            {
                if (cycle.Count > 1)
                {
                    yield return(cycle);
                }
            }

            yield break;
        }
Exemplo n.º 9
0
        public void FourTreeNodes()
        {
            var a = new StringTarjanNode("A");
            var b = new StringTarjanNode("B");
            var c = new StringTarjanNode("C");
            var d = new StringTarjanNode("D");

            a.Neighbors.Add(b);
            b.Neighbors.Add(c);
            b.Neighbors.Add(d);

            var underTest = new Tarjan(a, b, c, d);

            Assert.That(underTest.ResultSets.Count, Is.EqualTo(4));
        }
        public void TwoCycles()
        {
            var a = new StringTarjanNode("A");
            var b = new StringTarjanNode("B", a);

            a.Neighbors.Add(b);

            var c = new StringTarjanNode("C");
            var d = new StringTarjanNode("D", c);

            c.Neighbors.Add(d);

            var underTest = new Tarjan(a, b, c, d);

            Assert.That(underTest.ResultSets.Count, Is.EqualTo(2));
        }
Exemplo n.º 11
0
        public void TwoIndepdendedChainsOfTwoNodes()
        {
            var a = new StringTarjanNode("A");
            var b = new StringTarjanNode("B");

            a.Neighbors.Add(b);

            var c = new StringTarjanNode("C");
            var d = new StringTarjanNode("D");

            c.Neighbors.Add(d);

            var underTest = new Tarjan(a, b, c, d);

            Assert.That(underTest.ResultSets.Count, Is.EqualTo(4));
        }
Exemplo n.º 12
0
        public void CycleSix()
        {
            UnweightedGraphMatrix graph = new UnweightedGraphMatrix(true, 6);

            graph.AddArc(0, 3);
            graph.AddArc(0, 2);

            graph.AddArc(1, 3);

            graph.AddArc(3, 4);
            graph.AddArc(3, 5);

            graph.AddArc(4, 1);

            graph.AddArc(5, 1);

            Tarjan.Run(graph);
        }
Exemplo n.º 13
0
        public void KahnDifference()
        {
            UnweightedGraphMatrix graph = new UnweightedGraphMatrix(true, 6);

            graph.AddArc(0, 1);
            graph.AddArc(0, 2);

            graph.AddArc(1, 2);

            graph.AddArc(3, 1);

            graph.AddArc(4, 2);
            graph.AddArc(4, 1);

            Assert.AreEqual(0, Tarjan.Run(graph)[0]);
            Assert.AreEqual(3, Tarjan.Run(graph)[1]);
            Assert.AreEqual(4, Tarjan.Run(graph)[2]);
            Assert.AreEqual(1, Tarjan.Run(graph)[3]);
            Assert.AreEqual(2, Tarjan.Run(graph)[4]);
        }
Exemplo n.º 14
0
        public void FivePeaksSeveralScatter()
        {
            // как разобрался, не увидел сложности в таких тестрах, на каждом уровне вершины просто в порядке возрастания
            UnweightedGraphMatrix graph = new UnweightedGraphMatrix(true, 5);

            graph.AddArc(0, 1);
            graph.AddArc(0, 2);

            graph.AddArc(1, 2);

            graph.AddArc(3, 1);

            graph.AddArc(4, 2);
            graph.AddArc(4, 1);

            Assert.AreEqual(0, Tarjan.Run(graph)[0]);
            Assert.AreEqual(3, Tarjan.Run(graph)[1]);
            Assert.AreEqual(4, Tarjan.Run(graph)[2]);
            Assert.AreEqual(1, Tarjan.Run(graph)[3]);
            Assert.AreEqual(2, Tarjan.Run(graph)[4]);
        }
Exemplo n.º 15
0
        public void FivePeaks()
        {
            UnweightedGraphMatrix graph = new UnweightedGraphMatrix(true, 5);

            graph.AddArc(0, 1);
            graph.AddArc(0, 2);
            graph.AddArc(0, 3);
            graph.AddArc(0, 4);

            graph.AddArc(1, 3);

            graph.AddArc(2, 3);
            graph.AddArc(2, 4);

            graph.AddArc(3, 4);

            Assert.AreEqual(0, Tarjan.Run(graph)[0]);
            Assert.AreEqual(1, Tarjan.Run(graph)[1]);
            Assert.AreEqual(2, Tarjan.Run(graph)[2]);
            Assert.AreEqual(3, Tarjan.Run(graph)[3]);
            Assert.AreEqual(4, Tarjan.Run(graph)[4]);
        }
Exemplo n.º 16
0
        public static void solve()
        {
            for (int f = 1; f <= 6; f++)
            {
                Tarjan             scc          = new Tarjan();
                StreamReader       sr           = new StreamReader(@"C:\Users\Feras\Desktop\sat" + f + ".txt");
                List <List <int> > adj          = new List <List <int> >();
                List <List <int> > adjTranspose = new List <List <int> >();
                int   n    = int.Parse(sr.ReadLine());
                int[] seen = new int[n];

                for (int i = 0; i < 2 * n; i++)
                {
                    adj.Add(new List <int>());
                    adjTranspose.Add(new List <int>());
                }

                int      a, b, _a, _b;
                string[] str;
                while (!sr.EndOfStream)
                {
                    str = sr.ReadLine().Split(' ');
                    a   = int.Parse(str[0]);
                    b   = int.Parse(str[1]);
                    seen[Math.Abs(a) - 1]++;
                    seen[Math.Abs(b) - 1]++;
                }

                sr.Close();
                sr = new StreamReader(@"C:\Users\Feras\Desktop\sat" + f + ".txt");

                sr.ReadLine();
                while (!sr.EndOfStream)
                {
                    str = sr.ReadLine().Split(' ');
                    a   = int.Parse(str[0]);
                    b   = int.Parse(str[1]);

                    if (seen[Math.Abs(a) - 1] == 1 || seen[Math.Abs(b) - 1] == 1)
                    {
                        continue;
                    }

                    if (a < 0)
                    {
                        a  = (Math.Abs(a) - 1) + n;
                        _a = a - n;
                    }
                    else
                    {
                        a  = a - 1;
                        _a = a + n;
                    }

                    if (b < 0)
                    {
                        b  = (Math.Abs(b) - 1) + n;
                        _b = b - n;
                    }
                    else
                    {
                        b  = b - 1;
                        _b = b + n;
                    }

                    adj[_a].Add(b);
                    if (b != a && _a != _b)
                    {
                        adj[_b].Add(a);
                    }

                    /*
                     * // Add Edge Transpose
                     * adjTranspose[b].Add(_a);
                     * if (b != a && _a != _b)
                     *  adjTranspose[a].Add(_b);
                     * */
                }

                //scc.RunKosaraju(adj, adjTranspose, n);
                scc.RunTarjan(adj, 2 * n);

                bool satisfiable = true;
                for (int i = 0; i < n && satisfiable; i++)
                {
                    satisfiable = !scc.SameComponent(i, i + n);
                    if (!satisfiable)
                    {
                        Console.WriteLine(i);
                    }
                }

                Console.WriteLine(satisfiable);
                //scc.PrintComponents();
                sr.Close();
            }
        }
Exemplo n.º 17
0
        public static void solve()
        {
            for (int f = 1; f <= 6; f++)
            {
                Tarjan scc = new Tarjan();
                StreamReader sr = new StreamReader(@"C:\Users\Feras\Desktop\sat" + f + ".txt");
                List<List<int>> adj = new List<List<int>>();
                List<List<int>> adjTranspose = new List<List<int>>();
                int n = int.Parse(sr.ReadLine());
                int[] seen = new int[n];

                for (int i = 0; i < 2 * n; i++)
                {
                    adj.Add(new List<int>());
                    adjTranspose.Add(new List<int>());
                }

                int a, b, _a, _b;
                string[] str;
                while (!sr.EndOfStream)
                {
                    str = sr.ReadLine().Split(' ');
                    a = int.Parse(str[0]);
                    b = int.Parse(str[1]);
                    seen[Math.Abs(a) - 1]++;
                    seen[Math.Abs(b) - 1]++;
                }

                sr.Close();
                sr = new StreamReader(@"C:\Users\Feras\Desktop\sat" + f + ".txt");

                sr.ReadLine();
                while(!sr.EndOfStream)
                {
                    str = sr.ReadLine().Split(' ');
                    a = int.Parse(str[0]);
                    b = int.Parse(str[1]);

                    if (seen[Math.Abs(a) - 1] == 1 || seen[Math.Abs(b) - 1] == 1)
                        continue;

                    if (a < 0)
                    {
                        a = (Math.Abs(a) - 1) + n;
                        _a = a - n;
                    }
                    else
                    {
                        a = a - 1;
                        _a = a + n;
                    }

                    if (b < 0)
                    {
                        b = (Math.Abs(b) - 1) + n;
                        _b = b - n;
                    }
                    else
                    {
                         b = b - 1;
                        _b = b + n;
                    }

                    adj[_a].Add(b);
                    if(b != a && _a != _b)
                        adj[_b].Add(a);
                    /*
                    // Add Edge Transpose
                    adjTranspose[b].Add(_a);
                    if (b != a && _a != _b)
                        adjTranspose[a].Add(_b);
                     * */
                }

                //scc.RunKosaraju(adj, adjTranspose, n);
                scc.RunTarjan(adj, 2 * n);

                bool satisfiable = true;
                for (int i = 0; i < n && satisfiable; i++)
                {
                    satisfiable = !scc.SameComponent(i, i + n);
                    if (!satisfiable)
                        Console.WriteLine(i);
                }

                Console.WriteLine(satisfiable);
                //scc.PrintComponents();
                sr.Close();
            }
        }
Exemplo n.º 18
0
 public void NullCheck()
 {
     Tarjan.Run(null);
 }
Exemplo n.º 19
0
        public static void Enum_Maximum_Matching(Dictionary <string, List <string> > G)
        {
            //creating adjecency matrix with its values as integers which will be given as input to maximum HopcroftKarp method.
            var matchingInput = new List <int[]>(); //it is the input to the maximum matching method(hopcroftKarp) It contains adjecency matrix in the form of integers
            var modelIntMap   = new Dictionary <string, int>();
            int count         = 0;
            int t             = 0;

            foreach (var elem in G)
            {
                int[] temp = new int[elem.Value.Count];
                foreach (string mod in elem.Value)
                {
                    if (!modelIntMap.Keys.Contains(mod))
                    {
                        modelIntMap.Add(mod, count++);
                    }
                    temp[t++] = modelIntMap[mod]; //here array is created i.e. row of adjecancy matrix
                }
                matchingInput.Add(temp);          //here the array created above is added to the adjecency list( a representation of adjecency matrix representation)
                t = 0;
            } // at the end of this for loop there is a adjecency list containing integers as its elements and a dictionary of mapping is created to store information of
              //these integers and to which model these intergers are mapped to "modelIntMap< name of model, integer associated to model>"

            var varIntMap = new Dictionary <string, int>();

            count = modelIntMap.Count; //reassigned value of "count" variable
            foreach (var elem in G)
            {
                if (!varIntMap.Keys.Contains(elem.Key))
                {
                    varIntMap.Add(elem.Key, count++);
                }
            }

            //Step1: Finding a maximum matching M of G and output M.
            var matching = HopcroftKarp.GetMatching(matchingInput, modelIntMap.Count); //here "matching" stores the matched variables on right of bipartite graph
                                                                                       /* Here matching obtained above is used to create matched edges as list containing two integers ..first int is source location while second destination for a link/edge*/

            /* List<List<int>> matchingEdges = new List<List<int>>();
             * int inc = 0;
             * foreach (var match in matching)
             * {
             *   List<int> temp = new List<int>();
             *   temp.Add(match);
             *   temp.Add(varIntMap.Values.ElementAt(inc));
             *   matchingEdges.Add(temp);
             * }*/
            var matchingEdges = new List <string>();
            int inc           = 0;

            foreach (var match in matching)
            {
                if (!(match < 0))
                {
                    matchingEdges.Add(varIntMap.Values.ElementAt(inc++).ToString() + match.ToString());
                }
            }

            Dictionary <int, List <int> > UnDirectBGInt = UndirectedGraphStringsToInt(G, modelIntMap, varIntMap);

            int[,] DirectedBGEdges = DirectedGraph(UnDirectBGInt, matchingEdges);
            var g    = new Tarjan(DirectedBGEdges);
            var SCCs = g.GetStronglyConnectedComponents();

            //g = new Tarjan(new[,] {
            //    {1, 2}, {2, 3}, {2, 4}, {2, 5}, {3, 1}, {4, 1}, {4, 6}, {4, 8}, {5, 6}, {6, 7}, {7, 5}, {8, 6}
            //});
            //g = new Tarjan(new[,] {
            //    {1, 2}, {2,3 }, {3, 1}, {3, 4}, {4, 5}, {5, 6}, {6, 3}
            //});
            g = new Tarjan(new[, ] {
                { 1, 2 }, { 2, 3 }, { 3, 1 }, { 4, 3 }, { 5, 4 }, { 6, 5 }, { 3, 6 }
            });
            SCCs = g.GetStronglyConnectedComponents();

            //Step2: Trim unnecessary arcs from D(G,M) by a strongly connected component decomposition algorithm.


            //Step:3 Call Enum_Maximum_Matching_Iter(G,M,D(G,M))
        }
Exemplo n.º 20
0
        public void InputData()
        {
            UnweightedGraphList graph = new UnweightedGraphList(false);

            Tarjan.Run(graph);
        }
Exemplo n.º 21
-1
        public IEnumerable<Cycle> FindCycles()
        {
            var algo = new Tarjan();

            foreach (var cycle in algo.FindCycles(this))
            {
                if(cycle.Count > 1)
                    yield return cycle;
            }

            yield break;
        }