我要的是C语言的呀c dfs实现拓扑排序
时间: 2024-10-25 16:15:38 浏览: 30
在C语言中,我们可以使用深度优先搜索(Depth First Search,DFS)算法来实现拓扑排序。拓扑排序通常应用于有向无环图(Directed Acyclic Graph,DAG)中,它会确定节点之间的依赖顺序,使得对于所有节点A,如果存在边A->B,则A在B之前。
下面是一个简单的C语言版本的DFS实现拓扑排序:
```c
#include <stdbool.h>
#include <stdio.h>
// 图的邻接表表示
typedef struct Node {
int data;
struct Node* next;
} Node;
struct AdjacencyList {
Node** nodes;
int num_nodes;
};
void addEdge(struct AdjacencyList* adj_list, int src, int dest) {
adj_list->nodes[src] = (Node*)malloc(sizeof(Node));
adj_list->nodes[src]->data = dest;
adj_list->nodes[src]->next = NULL;
}
bool visit(Node* node, bool visited[], int indegree[]) {
if (node == NULL)
return true;
if (visited[node->data])
return false;
visited[node->data] = true;
for (Node* neighbor = node; neighbor != NULL; neighbor = neighbor->next) {
indegree[neighbor->data]--;
if (!indegree[neighbor->data]) {
// 如果邻居的入度变为0,说明可以访问其邻居
visit(adj_list->nodes[neighbor->data], visited, indegree);
}
}
return true;
}
void topologicalSort(struct AdjacencyList* adj_list) {
int n = adj_list->num_nodes;
bool visited[n];
int indegree[n];
// 初始化所有节点未访问且入度为0
for (int i = 0; i < n; i++) {
visited[i] = false;
indegree[i] = 0;
}
// 计算每个节点的入度
for (int i = 0; i < n; i++) {
for (Node* node = adj_list->nodes[i]; node != NULL; node = node->next) {
indegree[node->data]++;
}
}
// 深度优先遍历并更新拓扑排序结果
for (int i = 0; i < n; i++) {
if (!visited[i]) {
if (!visit(adj_list->nodes + i, visited, indegree)) {
printf("Graph contains a cycle!\n");
break;
}
}
}
// 输出拓扑排序结果
for (int i = 0; i < n; i++)
if (visited[i])
printf("%d ", i);
printf("\n");
}
int main() {
// 添加节点和边,构建图...
// 然后调用topologicalSort函数
return 0;
}
```
这个代码首先创建了一个邻接列表表示图,然后通过`visit`函数进行深度优先遍历,并记录每个节点的入度。当某个节点的入度为0时,意味着它的所有前驱都已经遍历过,可以将其添加到结果序列中。如果在遍历过程中发现有循环(即入度始终不为0),则表示图不是有向无环图,无法进行拓扑排序。
阅读全文