Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/75: Рейтинг темы: голосов - 75, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 2
1

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

31.05.2016, 22:29. Показов 13579. Ответов 3

Author24 — интернет-сервис помощи студентам
Задача: отыскать кратчайший путь между двумя заданными вершинами в произвольном ациклическом ориентированном графе с нагруженными ребрами.
Граф представил матрицей смежности, использовал алгоритм топологической сортировки, но как я понял, с его помощью ищутся расстояния, а не сами пути. Можно ли как-то адаптировать его для поиска пути (т.е. именно цепочки вершин)?
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
      size_t vertex1, vertex2;
      cout << "Введите начальную вершину: ";
      cin >> vertex1;
      cout << "Введите конечную вершину: ";
      cin >> vertex2;
      
      size_t *d = new size_t[graph.getSize()];
      for (size_t i = 0; i < graph.getSize(); ++i)
        d[i] = graph.inf;
      d[vertex1] = 0;
      
      cout << "Номера вершин после топологической сортировки:" << endl;
      for (size_t i = 0; i < graph.getSize(); ++i)
      {
        cout << graph.getPosInPartialOrder(i) << " ";
      }
      
      for (size_t i = 0; i < graph.getSize(); ++i)
      {
        size_t pos = graph.getPosInPartialOrder(i);
        for (size_t j = 0; j < graph.getSize(); ++j)
          if (graph.edgeExists(pos, j))
          {
            size_t dist = d[j];
            d[j] = min(d[j], d[pos] + graph.getWeight(pos, j));
          }
      }
      
      cout << endl;
      
      if (d[vertex2] != graph.inf)
        cout << "Расстояние между вершинами " << vertex1 << " и " << vertex2 << " равно " << d[vertex2] << endl;
      else
        cout << "Не найден путь между заданными вершинами!" << endl;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2016, 22:29
Ответы с готовыми решениями:

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

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

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

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

3
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
31.05.2016, 22:44 2
Henkerr, Henkerr,
Так в чем проблема использовать известный и легкий Алгоритм Дейкстры? В свое время именно им и пользовался.

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
void Dijcstra(int st)
{
    int **w= new int*[n];
    for (int i=0;i<n;i++)
        *(w+i)=new int[n];
 
    bool visited[n];
    int D[n];
    for(int i=0;i<n;i++)
    {
        D[i]=*(*(w+st)+i);
        visited[i]=false;
    }
    D[st]=0;
    int index=0,u=0;
    for (int i=0;i<n;i++)
    {
        int min=INT_MAX;
        for (int j=0;j<n;j++)
        {
            if (!visited[j] && D[j]<min)
            {
                min=D[j]; 
                index=j;
            }
        }
        u=index;
        visited[u]=true;
        for(int j=0;j<n;j++)
        {
            if (!visited[j] && *(*(w+u)+j)!=INT_MAX && D[u]!=INT_MAX && (D[u]+*(*(w+u)+j)<D[j]))
            {
                D[j]=D[u]+*(*(w+u)+j);
            }
        }
    }
    cout<<"Вес пути из начальной вершины до остальных:\t\n";
    for (i=0; i<n; i++)
    {
        if (D[i]!=INT_MAX)
            cout<<st<<" -> "<<i<<" = "<<D[i]<<endl;
        else 
            cout<<st<<" -> "<<i<<" = "<<"маршрут недоступен"<<endl;
    }
 
    for(int j=0;j<n;j++)
      delete *(w+j);
    delete w;
}
Думаю, сможете переделать "под свои нужды"..
0
14 / 14 / 5
Регистрация: 10.03.2016
Сообщений: 35
31.05.2016, 22:57 3
Заведите дополнительный массив предыдущих вершин p, т.е. вершин, из которых мы пришли в текущую.

Эту строку раскройте в if:

C++
1
d[j] = min(d[j], d[pos] + graph.getWeight(pos, j));
внутри обновите значение p[j] = pos. В конце нужно просто пройтись по предыдущим вершинам из vertex2 до vertex1 и развернуть путь.
1
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 2
31.05.2016, 23:15  [ТС] 4
Humpty, спасибо, Ваш вариант сработал.
0
31.05.2016, 23:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2016, 23:15
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru