邻接矩阵存储的图的拓扑排序c语言代码
时间: 2024-12-19 14:15:45 浏览: 13
邻接矩阵是一种用于表示无向图的数据结构,其中每个顶点对应一个行和一列,矩阵的元素值表示两个顶点之间是否存在边。在C语言中,我们可以使用二维数组来实现邻接矩阵,并通过深度优先搜索(DFS)来找到拓扑排序的结果。
下面是一个简单的C语言代码示例,用于进行拓扑排序:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
int graph[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int inDegree[MAX_VERTICES]; // 记录入度
bool visited[MAX_VERTICES]; // 标记已访问节点
int stack[MAX_VERTICES]; // 拓扑排序栈
// 添加边到邻接矩阵
void addEdge(int u, int v) {
graph[u][v] = 1; // 如果u指向v,则在矩阵上设为1
graph[v][u] = 1; // 对称地,如果v指向u也添加边
}
// 检查某个节点是否可以进行拓扑排序
int isSafe(int u) {
return (inDegree[u] == 0);
}
// 使用深度优先搜索进行拓扑排序
void topologicalSortUtil(int u) {
visited[u] = true;
for (int i = 0; i < MAX_VERTICES; i++) {
if (graph[u][i] && !visited[i]) {
topologicalSortUtil(i); // 递归处理未访问的邻居
}
}
stack[MAX_VERTICES - 1] = u; // 入栈
stack[MAX_VERTICES - 2] = -1; // 假定栈大小为MAX_VERTICES
int top = MAX_VERTICES - 2;
for (int i = 0; i < MAX_VERTICES; i++) {
if (!visited[i]) {
topologicalSortUtil(i);
}
}
while (top >= 0) {
printf("%d ", stack[top--]); // 输出结果
}
}
// 主函数
void topologicalSort() {
for (int i = 0; i < MAX_VERTICES; i++) {
inDegree[i] = 0;
}
// 初始化所有节点为未访问
for (int i = 0; i < MAX_VERTICES; i++) {
visited[i] = false;
}
// 遍历邻接矩阵,计算每个节点的入度
for (int i = 0; i < MAX_VERTICES; i++) {
for (int j = 0; j < MAX_VERTICES; j++) {
if (graph[i][j]) {
inDegree[j]++;
}
}
}
// 从入度为0的节点开始遍历并进行排序
for (int i = 0; i < MAX_VERTICES; i++) {
if (isSafe(i)) {
topologicalSortUtil(i);
}
}
}
int main() {
// 初始化图和添加边...
topologicalSort();
return 0;
}
阅读全文