Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/196: Рейтинг темы: голосов - 196, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 23.03.2011
Сообщений: 7

Алгоритм Дейкстры

27.03.2011, 19:31. Показов 37932. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Нужна Ваша помощь. Мне нужно использовать алгоритм Дейкстры (поиск наименьшего расстояния в графе), и я нашел код :http://habrahabr.ru/blogs/personal/63347/
Однако никак не могу понять, как его по-человечески использовать (в смысле, метод Main)
Я делаю 2 массива (для вершин и ребер), потом запускаю AlgorithmRun, но собственно результата так и не получаю. Понимаю, что вопрос выглядит дико тупым, однако мой "замыленный" взгляд так и не выдает ошибки. Мне бы очень помог какой-нибудь простенький пример. Заранее спасибо...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2011, 19:31
Ответы с готовыми решениями:

Алгоритм Дейкстры
Всем привет. Срочно нужна помощь. Есть алгоритм Дейкстры на С++, нужно переписать на С#. Помогите #define _CRT_SECURE_NO_WARNINGS ...

Алгоритм Дейкстры
Люди добрые, помогите! Курсовая работа на эту тему. Может кто-нибудь сталкивался.

Алгоритм Дейкстры
помогите, пожалуйста! По системе двусторонних дорог определить, есть ли в ней город, из которого можно добраться в любой другой менее...

5
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
27.03.2011, 19:42
Выложи то что ты сделал в Main
0
0 / 0 / 0
Регистрация: 23.03.2011
Сообщений: 7
27.03.2011, 19:51  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            Point [] v = new Point[6] ;
            v[0] = new Point(0, false, "F");
            v[1] = new Point(9999, false, "A");
            v[2] = new Point(9999, false, "B");
            v[3] = new Point(9999, false, "C");
            v[4] = new Point(9999, false, "D");
            v[5] = new Point(9999, false, "E");
            Rebro[] rebras = new Rebro[10];
            rebras[0] = new Rebro(v[0], v[2], 8);
            rebras[1] = new Rebro(v[0], v[3], 4);//FC
            rebras[2] = new Rebro(v[0], v[1], 9);//FA
            rebras[3] = new Rebro(v[2], v[3], 7);//bc
            rebras[4] = new Rebro(v[2], v[5], 5);//be
            rebras[5] = new Rebro(v[3], v[5], 5);//ce
            rebras[6] = new Rebro(v[1], v[5], 6);//ae
            rebras[7] = new Rebro(v[1], v[4], 5);//ad
            rebras[8] = new Rebro(v[3], v[4], 4);//cd
            rebras[9] = new Rebro(v[2], v[4], 7);//bd
            DekstraAlgorim da = new DekstraAlgorim(v, rebras);
            da.AlgoritmRun(v[0]);
            List <string> b = PrintGrath.PrintAllPoints(da);
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
27.03.2011, 20:04
Полностью код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
 
/// <summary>
  /// Реализация алгоритма Дейкстры. Содержит матрицу смежности в виде массивов вершин и ребер
  /// </summary>
class DekstraAlgorim
{
 
    public Point[] points { get; private set; }
    public Rebro[] rebra { get; private set; }
    public Point BeginPoint { get; private set; }
 
    public DekstraAlgorim(Point[] pointsOfgrath, Rebro[] rebraOfgrath)
    {
        points = pointsOfgrath;
        rebra = rebraOfgrath;
    }
    /// <summary>
    /// Запуск алгоритма расчета
    /// </summary>
    /// <param name="beginp"></param>
    public void AlgoritmRun(Point beginp)
    {
        if (this.points.Count() == 0 || this.rebra.Count() == 0)
        {
            throw new DekstraException("Массив вершин или ребер не задан!");
        }
        else
        {
            BeginPoint = beginp;
            OneStep(beginp);
            foreach (Point point in points)
            {
                Point anotherP = GetAnotherUncheckedPoint();
                if (anotherP != null)
                {
                    OneStep(anotherP);
                }
                else
                {
                    break;
                }
 
            }
        }
 
    }
    /// <summary>
    /// Метод, делающий один шаг алгоритма. Принимает на вход вершину
    /// </summary>
    /// <param name="beginpoint"></param>
    public void OneStep(Point beginpoint)
    {
        foreach (Point nextp in Pred(beginpoint))
        {
            if (nextp.IsChecked == false)//не отмечена
            {
                float newmetka = beginpoint.ValueMetka + GetMyRebro(nextp, beginpoint).Weight;
                if (nextp.ValueMetka > newmetka)
                {
                    nextp.ValueMetka = newmetka;
                    nextp.predPoint = beginpoint;
                }
                else
                {
 
                }
            }
        }
        beginpoint.IsChecked = true;//вычеркиваем
    }
    /// <summary>
    /// Поиск соседей для вершины. Для неориентированного графа ищутся все соседи.
    /// </summary>
    /// <param name="currpoint"></param>
    /// <returns></returns>
    private IEnumerable<Point> Pred(Point currpoint)
    {
        IEnumerable<Point> firstpoints = from ff in rebra where ff.FirstPoint == currpoint select ff.SecondPoint;
        IEnumerable<Point> secondpoints = from sp in rebra where sp.SecondPoint == currpoint select sp.FirstPoint;
        IEnumerable<Point> totalpoints = firstpoints.Concat<Point>(secondpoints);
        return totalpoints;
    }
    /// <summary>
    /// Получаем ребро, соединяющее 2 входные точки
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    private Rebro GetMyRebro(Point a, Point b)
    {//ищем ребро по 2 точкам
        IEnumerable<Rebro> myr = from reb in rebra where (reb.FirstPoint == a & reb.SecondPoint == b) || (reb.SecondPoint == a & reb.FirstPoint == b) select reb;
        if (myr.Count() > 1 || myr.Count() == 0)
        {
            throw new DekstraException("Не найдено ребро между соседями!");
        }
        else
        {
            return myr.First();
        }
    }
    /// <summary>
    /// Получаем очередную неотмеченную вершину, "ближайшую" к заданной.
    /// </summary>
    /// <returns></returns>
    private Point GetAnotherUncheckedPoint()
    {
        IEnumerable<Point> pointsuncheck = from p in points where p.IsChecked == false select p;
        if (pointsuncheck.Count() != 0)
        {
            float minVal = pointsuncheck.First().ValueMetka;
            Point minPoint = pointsuncheck.First();
            foreach (Point p in pointsuncheck)
            {
                if (p.ValueMetka < minVal)
                {
                    minVal = p.ValueMetka;
                    minPoint = p;
                }
            }
            return minPoint;
        }
        else
        {
            return null;
        }
    }
 
    public List<Point> MinPath1(Point end)
    {
        List<Point> listOfpoints = new List<Point>();
        Point tempp = new Point();
        tempp = end;
        while (tempp != this.BeginPoint)
        {
            listOfpoints.Add(tempp);
            tempp = tempp.predPoint;
        }
 
        return listOfpoints;
    }
}
 
/// <summary>
  /// Класс, реализующий ребро
  /// </summary>
  class Rebro
  {
    public Point FirstPoint { get; private set; }
    public Point SecondPoint { get; private set; }
    public float Weight { get; private set; }
 
    public Rebro(Point first, Point second, float valueOfWeight)
    {
      FirstPoint = first;
      SecondPoint = second;
      Weight = valueOfWeight;
    }
 
  }
/// <summary>
/// Класс, реализующий вершину графа
/// </summary>
class Point
{
    public float ValueMetka { get; set; }
    public string Name { get; private set; }
    public bool IsChecked { get; set; }
    public Point predPoint { get; set; }
    public object SomeObj { get; set; }
    public Point(int value,bool ischecked)
    {
      ValueMetka = value;
      IsChecked = ischecked;
      predPoint = new Point();
    }
    public Point(int value, bool ischecked,string name)
    {
      ValueMetka = value;
      IsChecked = ischecked;
      Name = name;
      predPoint = new Point();
    }
    public Point()
    {
    }
}
 
// <summary>
/// для печати графа
/// </summary>
static class PrintGrath
{
    public static List<string> PrintAllPoints(DekstraAlgorim da)
    {
      List<string> retListOfPoints = new List<string>();
      foreach (Point p in da.points)
      {
        retListOfPoints.Add(string.Format("point name={0}, point value={1}, predok={2}", p.Name, p.ValueMetka, p.predPoint.Name ?? "нет предка"));
      }
      return retListOfPoints;
    }
    public static List<string> PrintAllMinPaths(DekstraAlgorim da)
    {
      List<string> retListOfPointsAndPaths = new List<string>();
      foreach (Point p in da.points)
      {
        
        if (p != da.BeginPoint)
        {
          string s = string.Empty;
          foreach (Point p1 in da.MinPath1(p))
          {
            s += string.Format("{0} ", p1.Name);
          }
          retListOfPointsAndPaths.Add(string.Format("Point ={0},MinPath from {1} = {2}", p.Name, da.BeginPoint.Name, s));
        }
 
      }
      return retListOfPointsAndPaths;
    }
}
 
class DekstraException:ApplicationException
{
    public DekstraException(string message):base(message)
    {
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        Point[] v = new Point[6];
        v[0] = new Point(0, false, "F");
        v[1] = new Point(9999, false, "A");
        v[2] = new Point(9999, false, "B");
        v[3] = new Point(9999, false, "C");
        v[4] = new Point(9999, false, "D");
        v[5] = new Point(9999, false, "E");
        Rebro[] rebras = new Rebro[10];
        rebras[0] = new Rebro(v[0], v[2], 8);
        rebras[1] = new Rebro(v[0], v[3], 4);//FC
        rebras[2] = new Rebro(v[0], v[1], 9);//FA
        rebras[3] = new Rebro(v[2], v[3], 7);//bc
        rebras[4] = new Rebro(v[2], v[5], 5);//be
        rebras[5] = new Rebro(v[3], v[5], 5);//ce
        rebras[6] = new Rebro(v[1], v[5], 6);//ae
        rebras[7] = new Rebro(v[1], v[4], 5);//ad
        rebras[8] = new Rebro(v[3], v[4], 4);//cd
        rebras[9] = new Rebro(v[2], v[4], 7);//bd
        DekstraAlgorim da = new DekstraAlgorim(v, rebras);
        da.AlgoritmRun(v[0]);
        List<string> b = PrintGrath.PrintAllMinPaths(da);
        for (int i = 0; i < b.Count; i++)
            Console.WriteLine(b[i]);
        Console.ReadKey(true);
    }
}
3
4 / 4 / 2
Регистрация: 21.02.2010
Сообщений: 81
18.04.2011, 18:14
можно по коду вопрос? про определение кратчайшего расстояния между вершинами 1-8 и 5-8. как их можно найти?
0
1 / 1 / 0
Регистрация: 25.11.2015
Сообщений: 26
21.04.2017, 11:09
Чтобы найти:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 static void Main(string[] args)
    {
        Point[] v = new Point[6];
        v[0] = new Point(0, false, "F"); //в любой из точек меняешь значение на 0 (в остальных оставляешь 9999) (начало)
        v[1] = new Point(9999, false, "A");
        v[2] = new Point(9999, false, "B");
        v[3] = new Point(9999, false, "C");
        v[4] = new Point(9999, false, "D");
        v[5] = new Point(9999, false, "E");
        Rebro[] rebras = new Rebro[10];
        rebras[0] = new Rebro(v[0], v[2], 8);
        rebras[1] = new Rebro(v[0], v[3], 4);//FC
        rebras[2] = new Rebro(v[0], v[1], 9);//FA
        rebras[3] = new Rebro(v[2], v[3], 7);//bc
        rebras[4] = new Rebro(v[2], v[5], 5);//be
        rebras[5] = new Rebro(v[3], v[5], 5);//ce
        rebras[6] = new Rebro(v[1], v[5], 6);//ae
        rebras[7] = new Rebro(v[1], v[4], 5);//ad
        rebras[8] = new Rebro(v[3], v[4], 4);//cd
        rebras[9] = new Rebro(v[2], v[4], 7);//bd
        DekstraAlgorim da = new DekstraAlgorim(v, rebras);
        da.AlgoritmRun(v[0]);                                               //выбираешь в каком именно ты поставил 0 (начало)
        List<string> b = PrintGrath.PrintAllMinPaths(da);
        for (int i = 0; i < b.Count; i++)                                 // b.Count меняешь на цифру до которого поинта считать (конец)
            Console.WriteLine(b[i]);
        Console.ReadKey(true);
    }
Знаю что тема мертва, но ответа нет и сам искал как сделать, переделываю в windowsform и пытаюсь сделать чтобы находить значения по 2 полям. У кого есть вариант лучше, пишите, а то 20 к просмотров и тишина)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2017, 11:09
Помогаю со студенческими работами здесь

Перевести код C++ на C#: алгоритм Дейкстры
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; using namespace std; char s,...

Алгоритм Дейкстры. Реализация Алгоритма
Здравствуйте, дорогие форумчане. Пишу реализацию сего алгоритма,столкнулся с типичной при самообучении проблемой. Долго пытался...

Алгоритм Дейкстры, перевод с Pascal
есть программа на языке Pascal, реализующий алгоритм Дейкстры, которую нужно переделать под С# Половину передалал, но затрял на тому, что...

Алгоритм Дейкстры: проверка на правильность
Купила алгоритм Дейкстры в фрилансе, хочу проверить, правильно ли мне написали всё ? Вот код: // Использование алгоритма Дейкстры для...

Алгоритм Дейкстры, от точки к точке
Есть, собственно алгоритм. Но он реализует кратчайший проход от одной вершины, ко всем остальным. Как получше сделать проход от любой (не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru