private void iteration(Title_Vertex workV) { //доки існують неопрацьовані ребра for (Title_Edge workE = _m.getMinNoMarkEdge(workV.index); workE != null; workE = _m.getMinNoMarkEdge(workV.index)) { Title_Vertex nextV; if (workV.index == workE.v1.index) { nextV = workE.v2; } else { nextV = workE.v1; } //Рахуємо шлях до наступної вершини if (nextV.weigth > workV.weigth + workE.edge.Weight) { //шлях, що розглядається коротший за існуючий nextV.weigth = workV.weigth + workE.edge.Weight; nextV.wayV = new List <Vertex>(workV.wayV); nextV.wayV.Add(nextV.vertex); nextV.wayE = new List <Edge>(workV.wayE); nextV.wayE.Add(workE.edge); } workE.state = true; } }
public Title_Edge getMinNoMarkEdge(int vertexIndex) { int w = int.MaxValue; Title_Edge result = null; int v = vertexIndex; for (int e = 0; e < _edges.Count; e++) { //якщо ребро виходить з робочої веришини (vertexIndex) if (_m[v, e] != unmarks) { //якщо ребро ще не опрацьоване if (!_edges[e].state) { //якщо знайдена вага ребра ще менша if (_m[v, e] < w) { w = _m[v, e]; result = _edges[e]; } } } } return(result); }