В настоящее время я кодирую алгоритм топологической сортировки, используя алгоритм удаления источника.
Сначала я определил вершину без входящих ребер в оставшемся орграфе и удалил ее вместе со всеми выходящими из нее ребрами. И порядок, в котором удаляются вершины, дает решение проблемы топологической сортировки.
Входные данные - это число вершин, которые я хочу отсортировать, и я использовал матрицу смежности, чтобы показать направление и существование ребер.
Проблема в том, что где-то в коде получается бесконечное числоцикл и в результате мой код не показывает результат.
Введено количество вершин: 4
Введите строку 10 1 1 0
Введите строку 20 0 0 1
Введите строку 30 0 0 1
Введите строку 40 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Большое спасибо! Ваши ответы очень полезны для меня!