private void CheckVertex(Vertex v) { if (v.neighbors.Count == 1) // если сосед только один, то он - вторая вершина этого технологического размера d и сам вертекс - висячий { MegaVertex mv = new MegaVertex(); mv.vertexList.Add(v); megaList.Add(mv); dicV_M.Add(v, mv); } else { for (int i = 0; i < v.neighbors.Count; i++) { if (v.dimensionTo[v.neighbors[i]]._type == type.nul && dicV_M.ContainsKey(v.neighbors[i])) { dicV_M[v.neighbors[i]].vertexList.Add(v); // этому мегавертексу теперь принадлежит и d.firstVertex dicV_M.Add(v, dicV_M[v.neighbors[i]]); break; // достаточно первого попавшегося } if (i == v.neighbors.Count - 1) // если перечислили всё и дошли до сюда, то значит, что эта вершина соединена с нетехнологическим размером { MegaVertex mv = new MegaVertex(); mv.vertexList.Add(v); megaList.Add(mv); dicV_M.Add(v, mv); } } } }
// обход в глубину private void DFS(MegaVertex start) { start.visited = true; foreach (MegaVertex n in start.neighbors) { if (!n.visited) { DFS(n); } } }
private void DFS_Cicle(MegaVertex v, MegaVertex parent) { if (v.visited) { cicle = true; return; } v.visited = true; foreach (MegaVertex n in v.neighbors) { if (n != parent) { DFS_Cicle(n, v); } } }
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- public void DeleteDimension(Dimension d) { MegaVertex mv1 = dicV_M[d.firstVertex]; MegaVertex mv2 = dicV_M[d.secondVertex]; mv1.neighbors.Remove(mv2); // удаляем из списка соседей мегавертексы mv2.neighbors.Remove(mv1); mv1.vertexList.Remove(d.firstVertex); // удаляем из списка вертексов соответствующего мегавертекса вертексы mv2.vertexList.Remove(d.secondVertex); dicV_M.Remove(d.firstVertex); dicV_M.Remove(d.secondVertex); if (mv1.vertexList.Count == 0) { megaList.Remove(mv1); } if (mv2.vertexList.Count == 0) { megaList.Remove(mv2); } connectedComponentSearch(); SearchCircle(); }