//Вершини, які мають взаємозв'язок private List<List<DataVertex>> thirdСondition(Graph graph) { var vertices = graph.Vertices.ToList(); var edges = graph.Edges.ToList(); DataVertex v1 = new DataVertex(); DataVertex v2 = new DataVertex(); List<List<DataVertex>> listV = new List<List<DataVertex>>(); for (int i = 0; i < vertices.Count; i++)//Йду по вершинах { var target = edges.FindAll(x => x.Source == vertices[i]);//Всі сини для даної вершини for (int j = 0; j < target.Count; j++)//Йду по всіх синах для поточної вершини { var target2 = edges.FindAll(x => x.Source == target[j].Target);//Всі сини сина поточної вершини for (int k = 0; k < target2.Count; k++) { if (target2[k].Target == vertices[i])//Якщо поточна вершина є сином її сина(тобто є взаємозв'язок) { v1 = vertices[i]; v2 = target2[k].Source; List<DataVertex> list = new List<DataVertex>(); list.Add(v1); list.Add(v2); listV.Add(list); } } } } if (listV.Count == 0) return null; return listV; }
//Створює графи на основі уточнених груп private Graph GenerateGraph() { graphs = new List<Graph>();//Лист графів для кожної групи for (int i = 0; i < calc.setElAfterV.Count; i++) { var Graph = new Graph(); HashSet<string> tempSet = new HashSet<string>(); foreach (string k in calc.setElAfterV[i])//Формування вершин { var Vertex = new DataVertex(k); Graph.AddVertex(Vertex); } var vlist = Graph.Vertices.ToList(); for (int j = 0; j < calc.groupsAfterV[i].Count; j++)//Формування ребер { for (int t = 0; t < calc.mas[calc.groupsAfterV[i].ElementAt(j)].Count - 1; t++) { var dataVertex1 = new DataVertex(calc.mas[calc.groupsAfterV[i].ElementAt(j)].ElementAt(t)); var dataVertex2 = new DataVertex(calc.mas[calc.groupsAfterV[i].ElementAt(j)].ElementAt(t + 1)); var Edge = new DataEdge(vlist.Find(x => x.Text == dataVertex1.Text), vlist.Find(x => x.Text == dataVertex2.Text)) { Text = string.Format("{0} -> {1}", vlist.Find(x => x.Text == dataVertex1.Text), vlist.Find(x => x.Text == dataVertex2.Text)) }; //Перевіряю чи є вже таке ребро DataEdge temp = new DataEdge(); if (Graph.TryGetEdge(Edge.Source, Edge.Target, out temp) == false) Graph.AddEdge(Edge); } } graphs.Add(Graph); } totalGraph = new Graph();//Граф для відображення(об'єднує всі графи) for (int i = 0; i < graphs.Count; i++) { totalGraph.AddVertexRange(graphs.ElementAt(i).Vertices.ToList()); totalGraph.AddEdgeRange(graphs.ElementAt(i).Edges.ToList()); } return totalGraph; }