powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / графы
11 сообщений из 11, страница 1 из 1
графы
    #33101367
Себастьян
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин я уже так задолбался с этим заданием
может кто нибудь поможет:
Построить алгоритм поиска кратчайшего пути
между двумя вершинами в графе. Связывать можно
только четные с нечетными вершинами.

Или хотя бы дайте какие нибудь методички по
графам
...
Рейтинг: 0 / 0
графы
    #33101390
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
графы
    #33101392
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СебастьянБлин я уже так задолбался с этим заданием
может кто нибудь поможет:
Построить алгоритм поиска кратчайшего пути
между двумя вершинами в графе. Связывать можно
только четные с нечетными вершинами.

Или хотя бы дайте какие нибудь методички по
графам

Посмотри - может здесь чего полезного найдёшь
...
Рейтинг: 0 / 0
графы
    #33101462
Себастьян
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ничего я в этих ссылках не нашёл но всё равно спасибо
...
Рейтинг: 0 / 0
графы
    #33101489
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
посмотри тут
http://www.boost.org/libs/graph/doc/table_of_contents.html

можешь взять любой визитер на алгоритме дийкстры например и добавить свое условие.
...
Рейтинг: 0 / 0
графы
    #33104304
Фотография Nick74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего сложного-то?
Помечаешь исходную вершину циферкой 0.
i=0
цикл пока не помечены все вершины и пока не помечена конечная вершина
пометить все вершины на расстоянии один от вершин, помеченных i, числом i+1 (Ну ессно только при разной четности или как там у тебя)
прибавить к i единичку.
Конец цикла
конечная вершина помечена - есть путь!
Для того, чтобы знать путь, желательно вместе с числом i хранить в каждой вершине кто ее пометил. Тогда легко будет получить путь.
И усе.
...
Рейтинг: 0 / 0
графы
    #33104308
Фотография Nick74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да... Пардон. В условии цикла поставить не помеченность всех вершин, а наличие вершин, помеченных как i
...
Рейтинг: 0 / 0
графы
    #33106072
Себастьян
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а поподробнее можно а то я не всё уловил
...
Рейтинг: 0 / 0
графы
    #33107007
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, самое простое - это подкорректировать матрицу инцидентности так, что соединены только четные вершины с нечетными и применить классический алгоритм Дейкстры.
...
Рейтинг: 0 / 0
графы
    #33123091
Себастьян
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин ничего не получается может кто нибудь поможет?
пожалуйста
...
Рейтинг: 0 / 0
графы
    #33131554
Фотография Nick74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок... Пусть число вершин - N, а функция bool Link( int a, int b); возвращает есть ли ребро между вершинами a и b. Тогда алгоритм примерно такой:
Код: plaintext
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.
void GetPath( int from, int to ) {
  std::vector<int> mark(N), who(N);
  for (int i =  0 ; i < N; ++i) mark[i] = - 1 ;  // Изначально все вершины не помечены, кроме первой...
  mark[from] =  0 ;      
  bool fnd = true;
  int curindex =  0 ;
  while (fnd && mark[to] != - 1 ) { // Пока не нашли путь и пока на предыдущем шаге хоть что-то отметили (А вдруг граф несвязный?)
    fnd = false;
    for (int v =  0 ; v < N; ++v) {  // Цикл по всем вершинам, отмеченным на предыдущем шаге
      if (mark[v] != curindex) continue;
      for (int l =  0 ; l < N; ++l) {  // Если находим непомеченную, другой четности, связанную с текущей, то помечаем ее и пишем кто до нее добрался первым в who
        if (mark[l] != - 1  || (l& 1 )==(v& 1 ) || !Link( l, v)) continue;
        mark[l] = curindex +  1 ;
        who[l] = v;
        fnd = true; 
      }
    }
    ++curindex;
  }
  if (!fnd) printf( "Путь не найден" );
  else { // Печатаем путь, правда в обратном порядке...
    for (int start = to; start != from; start = who[start]) 
      printf( "Вершина %d", start );
    printf( "Вершина %d", from );
  }  
}
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / графы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]