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

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

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

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

можешь взять любой визитер на алгоритме дийкстры например и добавить свое условие.
...
Рейтинг: 0 / 0
07.06.2005, 11:29
    #33104304
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
графы
Чего сложного-то?
Помечаешь исходную вершину циферкой 0.
i=0
цикл пока не помечены все вершины и пока не помечена конечная вершина
пометить все вершины на расстоянии один от вершин, помеченных i, числом i+1 (Ну ессно только при разной четности или как там у тебя)
прибавить к i единичку.
Конец цикла
конечная вершина помечена - есть путь!
Для того, чтобы знать путь, желательно вместе с числом i хранить в каждой вершине кто ее пометил. Тогда легко будет получить путь.
И усе.
...
Рейтинг: 0 / 0
07.06.2005, 11:30
    #33104308
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
графы
А, да... Пардон. В условии цикла поставить не помеченность всех вершин, а наличие вершин, помеченных как i
...
Рейтинг: 0 / 0
07.06.2005, 22:24
    #33106072
Себастьян
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
графы
а поподробнее можно а то я не всё уловил
...
Рейтинг: 0 / 0
08.06.2005, 12:49
    #33107007
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
графы
Вообще, самое простое - это подкорректировать матрицу инцидентности так, что соединены только четные вершины с нечетными и применить классический алгоритм Дейкстры.
...
Рейтинг: 0 / 0
18.06.2005, 13:59
    #33123091
Себастьян
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
графы
Блин ничего не получается может кто нибудь поможет?
пожалуйста
...
Рейтинг: 0 / 0
23.06.2005, 15:33
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / графы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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