2013-03-07 3 views
0

Я пытаюсь реализовать Floryd алгоритм в C++Floyd алгоритм в C++

Я это уже:

средство узел, где край начинается.

b означает узел, на котором заканчивается край.

t означает время края.

m означает количество ребер.

n означает количество узлов.

typedef pair<int,int> nodo; 
vector <nodo> g[100000]; 

void preguntarFloyd() 
{ 
    g->clear(); 
    int m; 
    int contador = 0; 
    cin m; 

    for(int k = 0; k < m ; k++) 
    { 
     int a, b, t; 
     cin >> a >> b >> t; 
     g[a].push_back(nodo(b,t)); 
    } 

    for (int k = 0; k < n; k++) 
    { 
     for(int i = 0; i < n; i++) 
     { 
      for(int j = 0; j <n; j++) 
      { 
       if(g[i][k].second + g[k][j].second < g[i][j].second) 
       { 
        g[i][j].second = g[i][k].second + g[k][j].second; 
       } 
      } 
     } 
    } 


} 

Когда я пытаюсь код, программа происшествий говоря: «Выражение: Вектор индекс вне диапазона»

Я надеюсь, что вы, ребята, можете мне помочь, так как я не был в состоянии решить эту проблему!

+7

Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (Затем, если необходимо, вы должны создать [минимальный тестовый сценарий] (http://sscce.org).) –

+1

Что такое 'n'? Какие материалы вы предоставляете при запуске? – Dave

+0

, где это происходит? какой индекс он терпит неудачу? что такое 'n'? –

ответ

1

двух наиболее распространенных способов представления графа является:

  • Соседство-лист
  • Соседство-матрица

У вас есть одна структура данных, в фазе инициализации вы справляетесь как если бы это был список смежности, тогда вы пытаетесь получить к нему доступ, как если бы это была матрица смежности. Очевидно, что это никогда не сработает ...

+0

Это замечательный ответ! Как я могу получить к нему доступ, как если бы это был список смежности ??? –

+0

У вас есть проверять каждый элемент в списке и искать этот конкретный ребро - например: если вы ищете (i, j) поиск в g [i] для края к j, если нет ребра, то на этом этапе маршрут не может сократите. –

+0

ПРИМЕЧАНИЕ. Вы, кажется, новичок, используя матрицу, поскольку общий формат может облегчить вашу жизнь ... в этом случае вам нужно специальное значение, чтобы обозначить, что нет связи (0, -1, INT_MAX, и т. д.) –