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)); }
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); }
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)); }
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]); }
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; }
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)); }
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)); }
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); }
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]); }
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]); }
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]); }
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(); } }
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(); } }
public void NullCheck() { Tarjan.Run(null); }
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)) }
public void InputData() { UnweightedGraphList graph = new UnweightedGraphList(false); Tarjan.Run(graph); }
public IEnumerable<Cycle> FindCycles() { var algo = new Tarjan(); foreach (var cycle in algo.FindCycles(this)) { if(cycle.Count > 1) yield return cycle; } yield break; }