这个图按道理来讲拓扑排序的结果不应该是0,1,2,3,4,5,6,7,8吗(如图二),为什么我的代码输出来的却是逆着的,并且还没有0,感觉代码也都挺完美的

这个图按道理来讲拓扑排序的结果不应该是0,1,2,3,4,5,6,7,8吗(如图二),为什么我的代码输出来的却是逆着的,并且还没有0,感觉代码也都挺完美的

img

img


完整代码:
AdjGraph.h:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

#define MAXV 20
#define INF 32767
typedef struct ANode
{
    int adjvex;
    struct ANode* nextarc;
}ArcNode;
typedef struct
{
    int count;
    ArcNode* firstarc;
}VNode;
typedef struct
{
    VNode adjlist[MAXV];
    int n;
    int e;
}AdjGraph;

void CreateGraph(AdjGraph*& G, int A[][MAXV], int n, int e);

void TopSort(AdjGraph* G);

AdjGraph.cpp:

#include"AdjGraph.h"
void CreateGraph(AdjGraph*& G, int A[][MAXV], int n, int e)
{
    G = (AdjGraph*)malloc(sizeof(AdjGraph));
    G->n = n;
    G->e = e;
    int i = 0;
    int j = 0;
    ArcNode* p = NULL;
    for (i = 0; i < G->n; i++)
    {
        G->adjlist[i].firstarc = NULL;
        for (j = 0; j < G->n; j++)
        {
            if (A[i][j] != 0 && A[i][j] != INF)
            {
                p = (ArcNode*)malloc(sizeof(ArcNode));
                p->adjvex = i;
                p->nextarc = G->adjlist[i].firstarc;
                G->adjlist[i].firstarc = p;
            }
        }
    }
}

void TopSort(AdjGraph* G)
{
    int i = 0;
    ArcNode* p = NULL;
    int st[MAXV], top = -1;
    for (i = 0; i < G->n; i++)//初始化count
    {
        G->adjlist[i].count = 0;
    }
    for (i = 0; i < G->n; i++)//计算每个结点的入度
    {
        p = G->adjlist->firstarc;
        while (p != NULL)
        {
            G->adjlist[p->adjvex].count++;
            p = p->nextarc;
        }
    }
    for (i = 0; i < G->n; i++)//让每个度为0的入栈
    {
        if (G->adjlist[i].count == 0)
        {
            st[++top] = i;
        }
    }
    while (top != -1)
    {
        i = st[top--];
        printf("%d ", i);
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            G->adjlist[p->adjvex].count--;
            if (G->adjlist[p->adjvex].count == 0)
            {
                st[++top] = p->adjvex;
            }
            p = p->nextarc;
        }
    }
}

test.cpp:

#include"AdjGraph.h"
int main()
{
    int A[MAXV][MAXV] = { 
        {0, 6, 4, 5, INF, INF, INF, INF, INF},
        {INF, 0, INF, INF, 1, INF, INF, INF, INF},
        {INF, INF, 0, INF, 1, INF, INF, INF, INF},
        {INF, INF, INF, 0, INF, INF, INF, 2, INF},
        {INF, INF, INF, INF, 0, 9, 7, INF, INF},
        {INF, INF, INF, INF, INF, 0, INF, INF, 2},
        {INF, INF, INF, INF, INF, INF, 0, INF, 4},
        {INF, INF, INF, INF, INF, INF, INF, 0, 4},
        {INF, INF, INF, INF, INF, INF, INF, INF, 0} };
    int n = 9, e = 11;
    AdjGraph* G;
    CreateGraph(G, A, n, e);
    TopSort(G);
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7618195
  • 以下回答来自chatgpt:

    可能的原因有两个: 1. 在调用函数dfs时,应该按照深度优先搜索算法的规则,先处理邻居节点,再递归调用dfs函数,但代码中先递归调用dfs函数再处理邻居节点,导致结果逆序。 解决方案:修改dfs函数中的遍历顺序,先处理邻居节点,再递归调用dfs函数。代码如下:

    def dfs(node):
            visited_nodes.add(node)
            for neighbor in graph[node]:
                if neighbor not in visited_nodes:
                    dfs(neighbor)
            sorted_nodes.append(node)
    
    1. 缺失节点0的原因可能是在调用topological_sort函数时,没有将节点0加入到图中。 解决方案:将节点0加入到图中即可。代码如下:
    graph = {
        0: [],
        1: [7],
        2: [8],
        3: [4],
        4: [2],
        5: [],
        6: [7, 8],
        7: [5],
        8: [5]
    }
    sorted_nodes = topological_sort(graph)
    print(sorted_nodes)
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^