Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2019, 09:19   #1
Viktoria__1994
Новичок
Джуниор
 
Регистрация: 04.11.2019
Сообщений: 3
По умолчанию алгоритмм

Здравствуйте! Объясните, что происходит по коду.
Прокомментируйте код.

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Graphs;
using Graphs.Algorithms;
 
namespace Lab2
{
    class DijkstraData
    {
        public int Distance { get; set; }
        public Vertex Previous { get; set; }
    }
 
    public static class AlgorithmDijkstra
    {
        public static List<Vertex> Compute(Graph graph, int[,] weightMatrix, Vertex start, Vertex end)
        {
            List<Vertex> notVisited = new List<Vertex>((IEnumerable<Vertex>)graph);
 
            var track = new Dictionary<Vertex, DijkstraData>();
            track[start] = new DijkstraData { Previous = null, Distance = 0 };
 
            while (true)
            {
                Vertex toEnter = null;
                int bestDistance = int.MaxValue;
 
                foreach (var vertex in notVisited)
                {
                    if (track.ContainsKey(vertex) && track[vertex].Distance < bestDistance)
                    {
                        toEnter = vertex;
                        bestDistance = track[vertex].Distance;
                    }
                }
                if (toEnter == end)
                    break;
                if (toEnter == null)
                    return null;
                
                string[] edgeList = graph.GetEdgeList();
                foreach (var edge in edgeList)
                {
                    string[] res = System.Text.RegularExpressions.Regex.Split(edge, @"[^0-9]+")
                                                                       .Where(p => !string.IsNullOrEmpty(p))
                                                                       .ToArray();
                    if (Convert.ToInt32(res[1]) == toEnter.Value || Convert.ToInt32(res[2]) == toEnter.Value)
                    {
                        
                        if (graph.VertexValue(Convert.ToInt32(res[1])) != toEnter && 
                            graph.VertexValue(Convert.ToInt32(res[2])) != toEnter)
                        {
                            continue;
                        }
 
                        Vertex nextVertex;
 
                        if (graph.VertexValue(Convert.ToInt32(res[1])) == toEnter)
                            nextVertex = graph.VertexValue(Convert.ToInt32(res[2]));
                        else
                            nextVertex = graph.VertexValue(Convert.ToInt32(res[1]));
 
                        var currentDistance = track[toEnter].Distance + 
                                              weightMatrix[graph.VertexValue(Convert.ToInt32(res[1])).Value - 1,
                                                           graph.VertexValue(Convert.ToInt32(res[2])).Value - 1];
 
                        if (!track.ContainsKey(nextVertex) || track[nextVertex].Distance > currentDistance)
                            track[nextVertex] = new DijkstraData { Distance = currentDistance, Previous = toEnter };
 
                    }
                }
                //
                notVisited.Remove(toEnter);
            }
            var result = new List<Vertex>();
            while (end != null)
            {
                result.Add(end);
                end = track[end].Previous;
            }
            result.Reverse();
            return result;
        }
    }
}
______________________
Форматируйте код и используйте тег [CODE] (кнопка [CODE] в форме сообщения) при вставке кода на форум. Подробнее в FAQ

Последний раз редактировалось Вадим Мошев; 04.11.2019 в 11:28.
Viktoria__1994 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск вхождения слова во всех столбцах таблицы. Вопрос какой выбрать оптимальынй алгоритмм для 100 000 Laa911 Помощь студентам 4 25.08.2010 13:39
помогите доделать алгоритмм!! alatir Паскаль, Turbo Pascal, PascalABC.NET 2 23.08.2009 19:49