В настоящее время я кодирую алгоритм топологической сортировки с использованием алгоритма удаления источника.
Сначала я идентифицировал вершину без входящих ребер в оставшемся орграфе и удалил ее вместе со всеми отходящими от нее ребрами. И порядок, в котором удаляются вершины, дает решение проблемы топологической сортировки.
Входными данными является количество вершин, которые я хочу отсортировать, и я использовал матрицу смежности, чтобы показать направление и существование ребер.
Проблема в том, что где-то в коде образуется бесконечный цикл и в результате мой код не показывает результат.
Мой вклад
number of vertices: 4
Enter row 1
0 1 1 0
Enter row 2
0 0 0 1
Enter row 3
0 0 0 1
Enter row 4
0 0 0 0
И я ожидал такого результата:
1 2 3 4
Но у меня получился бесконечный цикл (результат вообще не отображается)
Думаю, здесь что-то не так:
while(count<n-1){
for(k=0;k<n;k++){
if((indeg[k]==0 && flag[k] ==0)) // zero incoming edges && not sorted yet
{
printf("%d ", k+1);
flag[k]=1; //checked
for(i=0;i<n;i++){
if(a[k][i]==1){ // if there is an outgoing edge
a[k][i]=0; // delete the outgoing edge
indeg[k]--; // decrease the indeg sing the outgoing edge is deleted
}
}
count++;
}
}
}
... но не могу найти, что с этим не так. И я не понимаю, почему не распечатывается даже первая вершина.
Вот полный код на случай:
# include <stdio.h>
# include <stdlib.h>
int main(void){
int i, j;
int k, n;
int a[10][10]; // adjacency matrix
int indeg[10] = {0}; // number of incoming edges
int flag[10] = {0}; // checked or not
int count=0; // count value for sorting vertices
printf("Enter the no of vertices: ");
scanf("%d",&n);
printf("Enter the adjacency matrix:\n");
for(i=0;i<n;i++){
printf("Enter row %d\n",i+1);
for(j=0;j<n;j++)
scanf("%d",&a[i][j]); // enter the adjacency matrix
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
indeg[i]+=a[j][i]; // number of incoming edges updated
printf("\nThe topological order is:");
while(count<n-1){
for(k=0;k<n;k++){
if((indeg[k]==0) && (flag[k] ==0)) // zero incoming edges && not sorted yet
{
printf("%d ", k+1);
flag[k]=1; //checked
for(i=0;i<n;i++){
if(a[k][i]==1){
a[k][i]=0; // delete the sorted vertice's outgoing edges
indeg[k]--; // subtract indeg since the outgoind edge is deleted
}
}
count++; // update the iteration count
break; // break the for loop and start a new one
}
}
}
}
Я использовал эту страницу для написания кода своего алгоритма (хотя код там также неверен в загруженном мной цикле while
) https://www.thecrazyprogrammer.com/2017/05/topological-sort.html