Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13

Алгоритм Дейкстры-модернизация

11.04.2018, 21:17. Показов 1738. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток..
Сижу вот и не пойму чего хочет от меня преподаватель..
Посмотрел на код и сказал, что не эффективен - убери восстановление пути. Сказал ввести массив посещенных вершин и как то в пару строк восстановить путь..Как?ума не приложу, помогите пожалуйста, сдать нужно до 16.04.18..Зависит от этой лабы зачет
Прилагаю код лабы
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
// Deikstra.cpp: определяет точку входа для консольного приложения.
//
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include<fstream>
#define SIZE 5
    using namespace std;
    int main()
    {
        
        
        int a[SIZE][SIZE]; // матрица связей
        int d[SIZE]; // минимальное расстояние
        int v[SIZE];// посещенные вершины
 
        
        int temp;
        int minindex, min;
        system("chcp 1251");
        system("cls");
        // Инициализация матрицы связейi
        //ifstream in("input.txt");
        for (int i = 0; i < SIZE; i++)
        {
            a[i][i] = 0;
            for (int j = i + 1; j < SIZE; j++) {
                printf("Введите расстояние %d - %d: ", i + 1, j + 1);
                scanf_s("%d", &temp);
                //in >> temp;
                a[i][j] = temp;
                a[j][i] = temp;
            }
        }
 
 
        // Вывод матрицы связей
        for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
                printf("%5d ", a[i][j]);
            printf("\n");
        }
        //Инициализация вершин и расстояний
        for (int i = 0; i < SIZE; i++)
        {
            d[i] = 10000;
            v[i] = 1;
        }
        d[0] = 0;
        // Шаг алгоритма
        do {
            minindex = 10000;
            min = 10000;
            
 
 
            //}
            for (int i = 0; i < SIZE; i++)
            { // Если вершину ещё не обошли и вес меньше min
                if ((v[i] == 1) && (d[i] < min))
                { // Переприсваиваем значения
                    min = d[i];
                    minindex = i;
                    
                }
            }
            // Добавляем найденный минимальный вес
            // к текущему весу вершины
            // и сравниваем с текущим минимальным весом вершины
            if (minindex != 10000)
            {
                for (int i = 0; i < SIZE; i++) {
                    
                    cout<< i + 1 << "=" << d[i] << endl;
                }
                cout << "При переходе в вершину: " << minindex +1 << "  мы получили выше изложенные расстояния до вершин"<< endl;
                cout << "---------------------------------------------" << endl;
 
                for (int i = 0; i < SIZE; i++)
                {
                    if (a[minindex][i] > 0)
                    {
                        temp = min + a[minindex][i];
                        if (temp < d[i])
                        {
                            d[i] = temp;
                        }
                    }
                }
                v[minindex] = 0;
            }
 
 
        } while (minindex < 10000);
        // Вывод кратчайших расстояний до вершин
        printf("\nКратчайшие расстояния до вершин: \n");
        for (int i = 0; i < SIZE; i++)
            printf("%5d ", d[i]);
 
        // Восстановление пути
        int ver[SIZE]; // массив посещенных вершин
        int end = 2; // индекс конечной вершины =  на +1 само едлаетася 
        ver[0] = end + 1; // начальный элемент - конечная вершина
            int k = 1; // индекс предыдущей вершины
        int weight = d[end]; // вес конечной вершины
        cout << endl;
        
        while (end > 0) // пока не дошли до начальной вершины
        {
            for (int i = 0; i < SIZE; i++) // просматриваем все вершины
                if (a[end][i] != 0)   // если связь есть
                {
                    int temp = weight - a[end][i]; // определяем вес пути из предыдущей вершины
                    if (temp == d[i]) // если вес совпал с рассчитанным
                    {                 // значит из этой вершины и был переход
                        weight = temp; // сохраняем новый вес
                        end = i;       // сохраняем предыдущую вершину
                        ver[k] = i + 1; // и записываем ее в массив
                        k++;
                        
                    }
                }
        }
        cout << endl;
 
        // Вывод пути (начальная вершина оказалась в конце массива из k элементов)
        printf("\nВывод кратчайшего пути\n");
        for (int i = k - 1; i >= 0; i--)
        {
        printf("%3d ", ver[i]);
            }
        
            getchar(); getchar();
 
            return 0;
        }
Добавлено через 2 часа 40 минут
Если точней изложить задачу,нужно избавиться от длинного куска восстановления пути и сделать его в пару строк путем введения массива посещенных и как-то его восстановить по нему...Как -ума не приложу
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2018, 21:17
Ответы с готовыми решениями:

Алгоритм Дейкстры
День добрый! Есть игровое поле M*M. Количесво графов - N. Есть матрица смежности этого игрового поля. Получить элемент матрицы можно...

Алгоритм Дейкстры
Помогите найти ошибку плз. Первый шаг алгоритма выполняет правильно,а дальше-нет. #include&lt;iostream&gt; #include&lt;fstream&gt; ...

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

12
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
11.04.2018, 21:28
Код я не смотрел - потому что мне очень и очень лень (да и код мне очень и очень не нравится)
Давай одну итерацию рассмотрим
нашли некую вершину ver, путь до которой из еще нерассмотренных минимален.
Начинается релаксация. Проходим по всем ребрам этой вершины и пробуем улучшить путь. Если путь можно улучшить, то предком это вершины будет наша ver

Когда путь найден начинаем путь с конца. Выводим end, par[end], par[par[end]], par[par[par[end]]], ...., start

Конец
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13
11.04.2018, 22:10  [ТС]
Код я не смотрел - потому что мне очень и очень лень (да и код мне очень и очень не нравится)
Давай одну итерацию рассмотрим
нашли некую вершину ver, путь до которой из еще нерассмотренных минимален.
Начинается релаксация. Проходим по всем ребрам этой вершины и пробуем улучшить путь. Если путь можно улучшить, то предком это вершины будет наша ver

Когда путь найден начинаем путь с конца. Выводим end, par[end], par[par[end]], par[par[par[end]]], ...., start

Конец
Массив в массиве в массиве? Как то даже не приходилось сталкиваться
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
11.04.2018, 22:31
неее.
Смотри. Массив предков par.
Как получить - знаем
Как вывести по нему путь
temp = end;
while(temp != start) { cout << par[temp] << " "; temp = par[temp]; }
Конец
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13
12.04.2018, 00:01  [ТС]
неее.
Смотри. Массив предков par.
Как получить - знаем
Как вывести по нему путь
temp = end;
while(temp != start) { cout << par[temp] << " "; temp = par[temp]; }
Конец
Примерно понимаю,однако для своей программы надо подумать,как это подставить
0
12.04.2018, 00:04

Не по теме:

прикол, если бы препод тут тоже сидел и советы раздавал:D

0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13
12.04.2018, 00:08  [ТС]
Не по теме:

прикол, если бы препод тут тоже сидел и советы раздавал
Хехе,встреча была бы так встреча
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13
13.04.2018, 20:23  [ТС]
ап тему
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
14.04.2018, 19:59
Так и в чем проблема-то?
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13
14.04.2018, 23:19  [ТС]
Так и в чем проблема-то?
ну надо как то переработать прогу без восстановления пути
я чекал тут другие подобные, были наработки
вчера взял другую лабу, он сказал старую покажи, а тут я вообще хз как без восстановления
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 13
21.04.2018, 19:25  [ТС]
В итоге прикинулся дурачком и сделал вид, что что-то поменял.. Лабу зачли. Спасибо всем, кто откликнулся
0
5 / 5 / 6
Регистрация: 23.03.2018
Сообщений: 98
22.04.2018, 18:19
Лучший ответ Сообщение было отмечено Leins как решение

Решение

Leins, социальная инженерия в действии
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.04.2018, 21:32
Цитата Сообщение от Leins Посмотреть сообщение
и сделал вид, что что-то поменял.
В армии поможет!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2018, 21:32
Помогаю со студенческими работами здесь

Алгоритм Дейкстры
Как на С++ в консольном приложении описать алгоритм Дейкстры?

Алгоритм Дейкстры
Всем доброго дня! Столкнулся с проблемой, никак не могу понять, как лучше реализовать алгоритм Дейкстры на с++. У меня есть двумерный...

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

Алгоритм Дейкстры
Дан ориентированный взвешенный граф. Найдите кратчайшее расстояние от одной заданной вершины до другой. Входные данные В первой...

Алгоритм Дейкстры
Добрый день, помогите пож-та решить задачи на с++. Нашел решение (расписаны все алгоритмы, процедуры подсчета и т. д.), но сложность...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru