2015-01-12 2 views
0

Я на самом деле пытаюсь реализовать алгоритм warshall floyd, но я встретил трудную точку. У меня возникла ошибка сегментации, когда я пытаюсь найти кратчайший путь в моей матрице последовательности. Я следую за этот учебник: floyd's warshall algorithmошибка сегментации вектора вставки вторая итерация

Все работает хорошо, кроме линии 124:

chemin.insert(it,sequenceTest[v1-1][temp-1]); 

где я получаю Segfault (Вы можете пропустить первую часть, за исключением, если вы хотите знать, как я реализовать алгоритм но проблема в второй части):

#include <iostream> 
#include <fstream> 
#include <vector> 
using namespace std; 
int main() 
{ 
int i,j,k; 
int sequenceTest [4][4] = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}}; 
int tempSequenceTest [4][4]; 
int distanceTest [4][4] = {{0,2,4,100000},{2,0,1,5},{4,1,0,3},{100000,5,3,0}}; 
int tempDistanceTest[4][4]; 

for(i=0;i<4;i++) 
{ 
    for(j=0;j<4;j++) 
    { 
     cout<<sequenceTest[i][j]<<" "; 
    } 
    cout<< endl; 
} 

cout<< endl; 

for(i=0;i<4;i++) 
{ 
    for(j=0;j<4;j++) 
    { 
     cout << distanceTest[i][j] << " "; 
    } 
    cout<< endl; 
} 

cout<< endl; 

for(k=0;k<3;k++) 
{ 
    cout <<endl; 
    for(i=0;i<4;i++) 
    { 
     for(j=0;j<4;j++) 
     { 
      cout << "i: " << i << " j: " << j << endl; 
      if(i == k) 
      { 
       tempSequenceTest[i][j] = sequenceTest[i][j]; 
       tempDistanceTest[i][j] = distanceTest[i][j]; 
       cout << " D " << tempDistanceTest[i][j] << " S " << tempSequenceTest[i][j]; 
      } 
      if(j == k) 
      { 
       tempSequenceTest[i][j] = sequenceTest[i][j]; 
       tempDistanceTest[i][j] = distanceTest[i][j]; 
       cout << " D " << tempDistanceTest[i][j] << " S " << tempSequenceTest[i][j]; 
      } 
      cout<< endl; 
     } 
    } 

    for(i=0;i<4;i++) 
     { 
      for(j=0;j<4;j++) 
      { 
       //cout<< "i: " << i << " j: " << j << " k:" << k << endl; 
       if(i!=k && j!=k) 
       { 
        if(distanceTest[i][j]> distanceTest[i][k] + distanceTest[k][j]) 
        { 
         tempDistanceTest[i][j] = distanceTest[i][k] + distanceTest[k][j]; 
         cout << distanceTest[i][j] << " > " << distanceTest[i][k] << " + " << distanceTest[k][j] << " = " << tempDistanceTest[i][j] << " " << i << j << endl; 
         tempSequenceTest[i][j] = k+1; 
        } 
        else 
        { 
         tempDistanceTest[i][j] = distanceTest[i][j]; 
         tempSequenceTest[i][j] = sequenceTest[i][j]; 
        } 
       } 
      } 
     } 
     cout<< endl; 
     for(i=0;i<4;i++) 
     { 
      for(j=0;j<4;j++) 
      { 
       distanceTest[i][j] = tempDistanceTest[i][j]; 
       sequenceTest[i][j] = tempSequenceTest[i][j]; 
      } 
     } 
     for(i=0;i<4;i++) 
     { 
      for(j=0;j<4;j++) 
      { 
       cout<<tempSequenceTest[i][j]<<" "; 
      } 
      cout<< endl; 
     } 

     cout<< endl; 

     for(i=0;i<4;i++) 
     { 
      for(j=0;j<4;j++) 
      { 
       cout << tempDistanceTest[i][j] << " "; 
      } 
      cout<< endl; 
     } 
} 

int v1, v2; 
v1 = 1; 
v2 = 4; 
vector <int> chemin; 
vector <int>::iterator it; 
chemin.push_back(v1); 
chemin.push_back(v2); 
int temp = v2; 
cout << sequenceTest[0][2]; 
while(sequenceTest[v1-1][temp-1] != v2) 
{ 
    it = chemin.begin() + 1; 
    cout << "V1: " << v1 << " V2: " << v2 << " Temp: " << temp << endl; 
    chemin.insert(it,sequenceTest[v1-1][temp-1]); 
    for(i=0;i<chemin.size();i++) 
    { 
     cout << chemin[i]; 
    } 
    cout << endl; 
    temp = sequenceTest[v1-1][temp-1]; 
} 
} 

Спасибо за внимание и за то, что нашли время, чтобы помочь мне!

ответ

1
chemin.insert(it,sequenceTest[v1-1][temp-1]); 

Это аннулирует итератор it, но вы многократно использовать его в итераций, которые следуют. Если вы хотите продолжить вставку в ту же позицию, запишите возвращаемое значение.

it = chemin.insert(it,sequenceTest[v1-1][temp-1]); 
+0

Я попытался добавить: it = chemin.insert (it, sequenceTest [v1-1] [temp-1]); сразу после chemin.insert (it, sequenceTest [v1-1] [temp-1]); он хранится segfault, и я старался, чтобы я попал в бесконечный цикл – mel

+0

@mel: Что значит «сразу после»? Вы имеете в виду, что у вас есть две линии, одна за другой? Это исправление является заменой, а не добавлением. –

+0

Я редактирую свой пост, но я думаю, что моя проблема не исходит из вставки больше – mel

Смежные вопросы