0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 8

Нахождение кратчайшего расстояния на графе с восстановлением пути

17.12.2013, 03:46. Показов 5283. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите разобраться. На вход программе подается граф в виде матрицы смежности. Необходимо найти кратчайшее расстояние от одной точки до другой,и реконструировать этот путь в виде списка вершин, через которые он проходит. Использую я алгоритм Флойда-Уоршелла, алгоритм сам работает, проверил вручную для каждой пары точек,благо их немного. Проблема встает при реконструировании пути, алгоритм которого я, если честно, не до конца понимаю, но все-таки попытался реализовать, т.к. время поджимает, курсовик надо сдавать. Реконструировал путь по принципу, указанному на сайте http://hci.fenster.name/304y/lab5/ (способ 1). И в 7 случаях из 25 получаю неверные результаты. Помогите, пожалуйста, исправить ошибки и объясните, как же все-таки правильно восстановить путь. Облазил много сайтов, но вот как-то не доходит до меня, как это сделать Листинг приведен ниже, он довольно нелепый, т.к. это черновой вариант программы и писался для того, чтобы понять все эти алгоритмы и суметь потом встроить все это в более сложный курсовой проект. Здесь довольно много лишних проверок, на которые не стоит обращать внимания, ибо я пока еще дурачок. Главное-придумать как записать путь в виде списка вершин Заранее спасибо


Java
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
package tratata;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
/**
 *
 * @author Антон
 */
public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        ArrayList<ArrayList<Integer>> qwa=new ArrayList<ArrayList<Integer>>(); // массив кратчайших путей
        ArrayList<Integer> qwo;
        ArrayList<ArrayList<Integer>> lal=new ArrayList<ArrayList<Integer>>();  // массив весов
        ArrayList<Integer> lol;
        ArrayList<ArrayList<Integer>> tops=new ArrayList<ArrayList<Integer>>(); // массив предков. 
        ArrayList<Integer> top;
        ArrayList<Integer> route=new ArrayList<Integer>(); // список вершин в пути
        Scanner in=new Scanner(new File("lol.txt"));
        Scanner inn=new Scanner(new File("lol.txt"));
        for (int i=0;i<5;i++)    // заполнение lal и tops 
        {
            lol=new ArrayList<Integer>();
            top=new ArrayList<Integer>();
            for (int j=0;j<5;j++)
            {
                top.add(i+1);
                lol.add(in.nextInt());
                System.out.print(lol.get(j));
            }
            System.out.println();
           // qwa.add(lol);
            lal.add(lol);
            tops.add(top);
        }
        System.out.println("вывел считанный lal"); // контролирую ввод, т.к. были с этим небольшие проблемы 
        for (int i=0;i<lal.size();i++)
            System.out.println(lal.get(i));
        System.out.println("Вывел tops");   // массив tops заполняется по алгоритму, указанному на сайте           
        for (int i=0;i<tops.size();i++)          // [url]http://hci.fenster.name/304y/lab5/[/url] 
            System.out.println(tops.get(i));     // реконструирование пути, способ №1
 
        for (int i=0;i<5;i++)
        {
            qwo=new ArrayList<Integer>();
            for (int j=0;j<5;j++)
            {
                qwo.add(inn.nextInt());
                System.out.print(qwo.get(j));
            }
            System.out.println();
           // qwa.add(lol);
            qwa.add(qwo);
        }
        System.out.println("вывел считанный qwa");
        for (int i=0;i<qwa.size();i++)
            System.out.println(qwa.get(i));
 /*       for (int i=0;i<lal.size();i++)
        {
            System.out.println("lal"+lal.get(i));
            System.out.println("qwa"+qwa.get(i));
        }
*/        System.out.println("вывел преобразованный qwa");  // несуществующим ребрам ставим в соотв-ие
        for (int i=0;i<qwa.size();i++)                               // огромное, в рамках задачи, число
        {
            for (int j=0;j<qwa.get(i).size();j++)
            {
                if (qwa.get(i).get(j)==0)
                    qwa.get(i).set(j,999999);
            }System.out.println(qwa.get(i));
        }
        System.out.println("контроль изменения lal");  // проверка чисто для себя, т.к. массив изменялся сам по себе
        for (int i=0;i<lal.size();i++)
            System.out.println(lal.get(i));
        System.out.println("преобразование матрицы кратч путей");
        for (int k=0;k<qwa.size();k++)
        {
            for (int i=0;i<qwa.size();i++)
            {
                for (int j=0;j<qwa.get(i).size();j++)
                {
                    if (qwa.get(i).get(j)>(qwa.get(i).get(k)+qwa.get(k).get(j)))
                    {
                        qwa.get(i).set(j, qwa.get(i).get(k)+qwa.get(k).get(j)); // изменение матр кратч путей
                        tops.get(i).set(j,tops.get(k).get(j));        // заполнение матрицы предков(предыдущ вершин)
                        route.add(tops.get(4).get(4));         // реконструирование пути
                    }
                }
            }
        }
        System.out.println("матрица кратч путей:");
 
        for (int i=0;i<qwa.size();i++)
            System.out.println(qwa.get(i));
        System.out.println("матрица предков");
        for (int i=0;i<tops.size();i++)
            System.out.println(tops.get(i));
        System.out.println("путь:");
        for (int i=0;i<route.size();i++)
            System.out.print(route.get(i));
}
}
Добавлено через 41 минуту
Если это имеет значение, на вход подается
0 2 0 0 5
2 0 4 0 1
0 4 0 1 2
0 0 1 0 3
5 1 2 3 0

Добавлено через 5 минут
в 86 строке
Java
1
route.add(tops.get(4).get(4));
создается список,в котором по идее должны храниться вершины. В данном случае для пути из 5 точки в 5.Должно было вывести 5-2(пункт отправления и следующая точка, пункт назначения в список не заносится). Пока что вот так проверял правильность алгоритма.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2013, 03:46
Ответы с готовыми решениями:

Нахождение кратчайшего пути в графе
Примитивный не взвешенный граф описан матрицей смежности, необходимо произвести расчет кратчайшего пути между всеми вершинами и записать...

Нахождение кратчайшего пути в графе, алгоритм Уоршелла
Привет всем! алгоритм уоршелла, нужно найти кратчайший путь в графе. ввожу матрицу 0 1 5 1 0 2 5 2 0 работает нормально, все...

Нахождение кратчайшего пути в графе (алгоритм Дейкстры)
Здравствуйте, помогите пожалуйста, СРОЧНО,написать псевдокод реализации нахождения кратчайшего пути в графе на языке СИ. Ввод производиться...

1
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 8
24.12.2013, 01:11  [ТС]
Закройте тему, уже не актуальна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2013, 01:11
Помогаю со студенческими работами здесь

Нахождение кратчайшего пути в неорентированном графе от заданой вершины к заданной
Добрый день. Вот решаю задачку о кратчайщем расстояние между двумя верщинами в неорентированном связном графе без циклов. Заданны такие...

Нахождение кратчайшего пути на взвешенном графе методом ветвей и границ
Доброго времени суток! Банальная задача, но реализацию на Prolog не нашла. Алгоритм поставленной задачи таков: 1. Создать одноимённую...

Нахождение кратчайшего расстояния и пройденного расстояния по траектории движения мыши
Здравствуйте, необходимо найти кратчайшее расстояние и пройденное расстояние по траектории между каждыми нажатиями левой кнопки мыши. ...

Поиск кратчайшего пути в графе
помогите сделать так чтобы в весе графа можно было вписывать не только целый числа, но и дробные....

Поиск кратчайшего пути на графе
Выдает ошибку Error 1 error C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru