コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }