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

Поиск кратчайшего пути в графе

18.12.2011, 01:26. Показов 69829. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Помогите решить задание пожалуйста: написать программу, решающую задачу в соответствие с вариантом, и вывести результат графически на экран.
Найти кратчайшие пути из точки M1 в точку M9
Миниатюры
Поиск кратчайшего пути в графе  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2011, 01:26
Ответы с готовыми решениями:

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

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

Восстановление кратчайшего пути в графе
Есть алгоритм нахождения кратчайших путей(Флойд), а как восстановить путь как узнать через какие вершины он прошел?туплю прогаю с утра)) ...

16
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 11:06  [ТС]
Я смотрел разные варианты программ здесь, но похожего не видел, больше всего смущает графическое решение... Помогите пожалуйста

Добавлено через 9 часов 40 минут
Ну помогите а?
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.12.2011, 11:15
Флойд, Дейкстра или Форд-Беллман. Надо только матрицу смежности построить.

Добавлено через 57 секунд
Дейкстра
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
#include <fstream>
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
   //**********************************************************************
    int a[500][500],d[500]={0},n,s,f,flag[500],l,min1=100000000,nmin=0;
    for (int i=0;i<=500;i++) flag[i]=1;
    std:: ifstream ifs ("input.txt");
    ifs >> n >> s >> f;
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n;j++)//ввод
    {
     ifs >> a[i][j];
     if (a[i][j]==-1 && i!=j) a[i][j]=32000;
    }
    ifs.close();
    //*********************************************************************
    l=s;
    for (int i=1;i<=n;i++) d[i]=a[l][i];//задание начальных значений массиву d
    flag[l]=0;
    
    for (int i=1;i<=n-1;i++)
    {
        min1=100000000;
        nmin=l;
        for (int j=1;j<=n;j++)
        if (flag[j]!=0 && min1>d[j]) 
        { 
           min1=d[j]; 
           nmin=j; 
        } // ищем ближайшую вершину
        
        l=nmin;
        
        flag[l]=0;
        
        for (int j=1;j<=n;j++)
        if (flag[j]!=0) 
        d[j]=std:: min (d[j],a[l][j]+d[l]); //минимальное расстояние до d[j]
        
    }
    
    
    std:: ofstream ofs ("output.txt");
    if (d[f]==32000) ofs << "-1";
    else ofs << d[f];
    ofs.close();
    return 0;
}


Флойд
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
#include <fstream>
#include <algorithm>
int main()
{
    int n, a[101][101];
    std:: ifstream ifs ("input.txt");
    ifs >> n;
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n;j++)
    ifs >> a[i][j];
    ifs.close();
    for (int k=1;k<=n;k++)
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n;j++)
    a[i][j]=std:: min (a[i][j],a[i][k]+a[k][j]);
    std:: ofstream ofs ("output.txt");
    for (int i=1;i<=n;i++)
    {
      for (int j=1;j<=n;j++)
      ofs << a[i][j] << " ";
      ofs << '\n';
    }
    ofs.close();
    return 0;
}


Добавлено через 2 минуты
А графику уже достроите
2
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 20:42  [ТС]
Я как раз и не знаю как графически вывести ответ, и с матрицей смежности тоже не пойму что делать...

Добавлено через 55 минут
Готов заплатить через Яндекс деньги! Только помогите, завтра сдать надо эту штуку... Еще бы блоксхему бы...

Добавлено через 28 минут
неужели никто не возьмется? 300-450 рублей заплачу за задачу и блоксхему...

Добавлено через 1 час 7 минут
ну возмитесь кто нибудь, завтра сдавать нужно, а я вообще в непонятках как делать
0
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
18.12.2011, 20:51
У меня маленький вопрос, какой алгоритм быстрее Дейкстры или Флойда?
0
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 20:53  [ТС]
У нас все делают через Дейкстра.
0
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
18.12.2011, 20:58
да я тоже про Дейкстру много инфы находил, про Флойда в первый раз услышал но реализация очень понравилась.
0
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 21:18  [ТС]
Ну как сделать то мое задание знает кто нибудь? Плачу 400 р. (прога и блоксхема)

Добавлено через 18 минут
А все, не надо, кажется я все сделал)))
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.12.2011, 21:41
Цитата Сообщение от aram_gyumri Посмотреть сообщение
Дейкстры или Флойда?
Флойд N^3
Дейкстра N^2
Дейкстра с кучей N*logN

Добавлено через 40 секунд
Иначе не было бы смысла в Дейкстре писать 20 строк, чем во Флойде 3
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 21:44  [ТС]
Народ, подойдет код для моего задания:

Code
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
//---------------------------------------------------------------------------
//Алгоритм Дейкстры.поиска кратчайшего пути
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
#pragma argsused
 
#define VERTEXES 9  //Число вершин в графе
 
int v;
int main(int argc, char* argv[])
{
   clrscr();
   int infinity=1000;                     // Бесконечность
   int p= VERTEXES;             // Количество вершин в графе
   int a[VERTEXES][VERTEXES]={ 0,1,0,0,1,3,  // Матрица смежности графа
                               1,0,5,0,0,1,
                               0,5,0,5,20,1,
                                 0,0,5,0,3,2,
                               1,0,20,3,0,10,
                               3,1,1,2,10,0  };
 
   // Будем искать путь из вершины s в вершину g
   int s;                   // Номер исходной вершины
   int g;                   // Номер конечной вершины
   cout<<"Введите s: ";      // Номер может изменяться от 0 до p-1
   cin>>s;
   cout<<"Введите g: ";
   cin>>g;
   int x[VERTEXES]; //Массив, содержащий единицы и нули для каждой вершины,
                  // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
                  // x[i]=1 - кратчайший путь в i-ю вершину уже найден
   int t[VERTEXES];  //t[i] - длина кратчайшего пути от вершины s в i
   int h[VERTEXES];  //h[i] - вершина, предшествующая i-й вершине
                 // на кратчайшем пути
 
   // Инициализируем начальные значения массивов
   int u;           // Счетчик вершин
   for (u=0;u<p;u++)
   {
      t[u]=infinity; //Сначала все кратчайшие пути из s в i 
    //равны бесконечности
      x[u]=0;        // и нет кратчайшего пути ни для одной вершины
   }
   h[s]=0; // s - начало пути, поэтому этой вершине ничего не предшествует
   t[s]=0; // Кратчайший путь из s в s равен 0
   x[s]=1; // Для вершины s найден кратчайший путь
   v=s;    // Делаем s текущей вершиной
   
   while(1)
   {
      // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
      for(u=0;u<p;u++)
      {
         if(a[v][u]==0)continue; // Вершины u и v несмежные
         if(x[u]==0 && t[u]>t[v]+a[v][u]) //Если для вершины u еще не 
    //найден кратчайший путь
                // и новый путь в u короче чем 
    //старый, то
         {
            t[u]=t[v]+a[v][u];  //запоминаем более короткую длину пути в
    //массив t и
            h[u]=v; //запоминаем, что v->u часть кратчайшего 
    //пути из s->u
         }
      }
 
      // Ищем из всех длин некратчайших путей самый короткий
      int w=infinity;  // Для поиска самого короткого пути
      v=-1;            // В конце поиска v - вершина, в которую будет 
                       // найден новый кратчайший путь. Она станет 
                       // текущей вершиной
      for(u=0;u<p;u++) // Перебираем все вершины.
      {
         if(x[u]==0 && t[u]<w) // Если для вершины не найден кратчайший 
                               // путь и если длина пути в вершину u меньше
                               // уже найденной, то
         {
            v=u; // текущей вершиной становится u-я вершина
            w=t[u];
         }
      }
      if(v==-1)
      {
         cout<<"Нет пути из вершины "<<s<<" в вершину "<<g<<"."<<endl;
         break;
      }
      if(v==g) // Найден кратчайший путь,
      {        // выводим его
         cout<<"Кратчайший путь из вершины "<<s<<" в вершину "<<g<<":";
       u=g;
       while(u!=s)
         {
            cout<<" "<<u;
            u=h[u];
         }
         cout<<" "<<s<<". Длина пути - "<<t[g];
       break;
      }
      x[v]=1;
   }
   getch();
}
/*Программа запрашивает вершины s и q и выводит кратчайший путь. Например, после ввода s = 3, q = 6, программа выводит 
 
Нет пути из вершины 3 в вершину 6. 
 
После ввода s = 0, q = 2 программа выводит 
 
Кратчайший путь из вершины 0 в вершину 2: 2 5 1 0. Длина пути = 3.*/
 
//---------------------------------------------------------------------------

Подойдет это?
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.12.2011, 21:46
Цитата Сообщение от bacekk Посмотреть сообщение
и вывести результат графически на экран.
...
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 21:50  [ТС]
Можно и без графического вывода оказывается.
Не компилится, пишет: Unable to open include file 'VCL.H'
как исправить?
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.12.2011, 21:50
убрать нафиг
0
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
19.12.2011, 02:02  [ТС]
А как будет выглядить матрица смежности для графа?

Добавлено через 3 часа 46 минут
Можете мне написать матрицу смежности для моего графа, пожалуйста...
Я так понял что она будет 9x9 и ставится 1 если из одной точки можно попасть в другую, а если нельзя то 0...
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
19.12.2011, 08:25
вроде так:
0 1 0 0 0 0 0 0 0
1 0 1 0 0 1 0 0 0
0 1 0 1 1 0 0 0 0
0 0 1 0 0 1 1 0 1
0 0 1 0 0 1 1 1 0
0 1 0 1 1 0 0 0 0
0 0 0 1 1 0 0 1 1
0 0 0 0 1 0 1 0 1
0 0 0 1 0 0 1 1 0
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
21.12.2011, 16:57  [ТС]
Народ, может вопрос не совсем по теме. Меня интересует как работает алгоритм Дейкстра на этом примере, я просто защищаю лабу уже второй раз подряд, заваливаюсь на одном и том же.
Вот как я ему объясняю: все расстояния между вершинами в начале равны бесконечности, начинаем из вершины м1, так как ей ничего не предшествует, кратчайший путь из м1 в м1 равен 0, потом идем дальше к вершине м2, записываем для нее расстояние от м1, допустим 1, и запоминаем для нее кратчайший путь. Далее из вершины м2 мы можем попасть в м3 или м6, идем в м3, так как логичнее сначала туда пойти, запоминаем расстояние и путь для нее, дальше у нас выбор между м5 и м4, идем в м4, запоминаем расстояние и путь для нее. а вот дальше все что бы я не говорил, он не воспринимал, и говорил, что все неправильно... Можете подсказать каким образом проходит алгоритм Дейкстра в этом графе и как мне все это преподу рассказать по шагам. Заранее спасибо)

Добавлено через 15 часов 0 минут
Ответьте, кто-нибудь..
0
5 / 5 / 1
Регистрация: 03.04.2013
Сообщений: 46
12.04.2013, 14:21
а как такое на visual basice 2005 сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2013, 14:21
Помогаю со студенческими работами здесь

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

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

Построить алгоритм поиска кратчайшего пути между двумя вершинами в графе
Блин я уже так задолбался с этим заданием может кто нибудь поможет: Построить алгоритм поиска кратчайшего пути между двумя...

Поиск кратчайшего пути
Как сделать что бы задача не считала стоимость проезда в обратную сторону ? #include &lt;cstdlib&gt; #include &lt;iostream&gt; ...

Поиск кратчайшего пути (рекурсия)
Помогите пожалуйста. Пусть имеется n городов. Некоторые из них соединены дорогами известной длины. С помощью рекурсии найти Кратчайшие...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru