2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Создание таблицы маршрутизации в графе
Сообщение31.03.2007, 21:30 


09/12/06
5
Есть класс, который описывает узел графа и класс, описывающий сам граф
Надо найти все пути из всех вершин в любую через рекурсию (именно через рекурсию!!! так поставлена задача!!!, в моей программе это функция join) и хранить их в таком виде: номер узла(до которого идем), номер соседа(через которого идет путь), количество шагов
Так вот я написал эту функцию, НО! она не так быстро работает как мне надо. Мне нужно, чтобы она работала для графа со 100 узлами (так НУЖНО). А у меня работает достаточно быстро только для 12 узлов
Вот примерный код (привожу пример только этой функции join и метода poisk, которые вызывает функцию join для всех вершин)
Код:
const int TOTALNODES = 11;   //количество узлов
const int TTL = 10;         //максимальная длина пути
struct map { int end; int start; int steps; };   //для таблицы маршрутизации
class Node;                              
struct marshrut {Node * zveno; };            //для хранения путей в графе
//используеться для поверки вхождение вершины графа в маршрут road
bool operator==(const marshrut & m1, const marshrut & m2)
{
   if (m1.zveno == m2.zveno)
      return true;
   return false;
}
//класс, описывающий узел графа
class Node
{
private:   
   Node * partners[TOTALNODES-1];   //хранит адреса соседей узла (признак конца NULL)
   int id;                     //номер узла
   vector<map> routetable;         //таблица маршрутизации
   
public:
   Node() {}
   ~Node() {}
   //поиск всех путей до вершниы this для вершин node1 через соседа node2
   void join(Node & node1, Node & node2, int ttl, vector<marshrut> road);
};
//класс, описывающий граф
class Graf
{
private:
   Node Nodes[TOTALNODES];                              //хранит все узлы графа
public:
   Graf();
   ~Graf() {}
   void poisk();                                    
};
void Node::join(Node & node1, Node & node2, int ttl, vector<marshrut> road)
{
    //node1 - для какого узла, node2 - через какого соседа
   //не нашли путь
   if (ttl < 0)
      return;
   if (this != &node1)
   {
      //добавляем вершину в маршрут road
      marshrut tmp;
      tmp.zveno = &node1;
      //tmp.end = &node2;
      road.push_back(tmp);
            
      //добавляем маршрут в таблицу маршрутизации
      map temp;
      //в какую вершину
      temp.end=this->id;
      //за сколько шагов нашли путь
      temp.steps = TTL - ttl;
      //через какую вершину нашли путь
      temp.start = node2.id;
      //добавляем в талицу маршрутизации
      node1.routetable.push_back(temp);
   }
   //просматриваем пути через соседей node1
   for (int i = 0; i < TOTALNODES-1 && node1.partners[i]; i++)
   {
      //для проверки вершины в маршруте road
      marshrut tmp;
      //tmp.start = &node1;
      tmp.zveno = node1.partners[i];
      //если возвращаемся в начальный узел или если пытаемся пройти по вершине второй раз
      if (this == node1.partners[i] || road.end() != find(road.begin(),road.end(),tmp))
         continue;
      join(*node1.partners[i],node1,ttl-1,road);
   }
}

void Graf::poisk()
{
   vector<marshrut> m;
   for (int i = 0; i < TOTALNODES; i++)
   {
      Nodes[i].join(Nodes[i],Nodes[i],TTL,m);
      cout<<"Node "<<i<<" OK"<<endl;
   }
}

 Профиль  
                  
 
 
Сообщение31.03.2007, 23:12 
Экс-модератор
Аватара пользователя


30/11/06
1265
ventola1912
Обрамляйте текст программ тегом [code]. Поверьте, выглядит лучше!

 Профиль  
                  
 
 
Сообщение03.04.2007, 19:16 


09/12/06
5
я что сложный вопрос задал???
почему никто не отвечает?

 Профиль  
                  
 
 
Сообщение04.04.2007, 01:06 
Экс-модератор
Аватара пользователя


30/11/06
1265
Потому, что никого Ваш вопрос не заинтересовал. А Ваше сообщение расценивается правилами как подъем темы (нарушение). Пожалуйста, придерживайтесь правил.

 Профиль  
                  
 
 
Сообщение04.04.2007, 02:47 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Посмотрите алгорифм Дейкстры поиска кратчайшего пути в графе и алгорифм нахождения матрицы соединений по матрице смежности (алгорифм Уоршала (Warshall), встречается также под названием алгорифм Флойда (Floyd)).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group