В соответствии с вашим вопросом, я получаю родительский массив как:
int parent[] = {-1,0,1,2,5,6,7,0,2};
Я также запускаю ваш код:
void printPath(int parent[], int j)
{
int temp = parent[j];
while (temp != - 1)
{
temp = parent[temp];
printf("%d ", temp);
}
}
Теперь отметим три вещи:
1) Инициализируйте int temp = j
, а не parent[j]
. Это гарантирует, что вы начинаете с вашего пути с j
, а не с parent[j]
.
2) Вместо этого:
temp = parent[temp];
printf("%d ", temp);
сделайте это:
printf("%d ", temp);
temp = parent[temp];
Это гарантирует, что вы сначала напечатаете j, а затем parent [j].
После внесения вышеуказанных изменений ваш вывод будет выглядеть следующим образом:
1 0
2 1 0
3 2 1 0
4 5 6 7 0
5 6 7 0
6 7 0
7 0
8 2 1 0
Теперь последняя заметка.
3) Чтобы получить желаемый результат, вам нужно распечатать в обратный порядок. Один из способов - сначала посчитать элементы на пути. Затем создайте массив такого размера. Перейдите снова, начиная с j
, и сохраните элементы в массиве. После этого вы можете распечатать массив в обратном порядке.
После внесения этих изменений мы получим следующий код:
void printPath(int parent[], int j)
{
// Initialized temp from j
int temp = j;
// int variable that will store the number of elements in path
int cnt=0;
// traversing the path for first time to get count of elements in path
while (temp != - 1)
{
cnt++;
temp = parent[temp];
}
// creating array of cnt size
int arr[cnt];
// traversing the path for second time.
// this time we will store elements in the array
temp = j;
int i=0;
while(temp!=-1){
arr[i++]=temp;
temp = parent[temp];
}
// printing the elements in reverse order
for(int i=cnt-1;i>=0;i--)
printf("%d ",arr[i]);
}
Приведенный выше код даст вам правильный вывод (как вы упомянули) :
0 1
0 1 2
0 1 2 3
0 7 6 5 4
0 7 6 5
0 7 6
0 7
0 1 2 8