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

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

18.12.2011, 01:26. Показов 69731. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru