C语言如何以邻接矩阵的存储形式求出拓扑序列,用代码显示出来
时间: 2024-05-12 16:20:36 浏览: 58
以下是使用邻接矩阵存储图并求解拓扑序列的示例代码:
```c
#include <stdio.h>
#define MAX_SIZE 100
int adjMatrix[MAX_SIZE][MAX_SIZE]; // 邻接矩阵存储图
int inDegree[MAX_SIZE]; // 记录每个节点的入度
int queue[MAX_SIZE]; // 队列
int front = 0, rear = 0; // 队列指针
// 邻接矩阵存储图的拓扑排序算法
void topologicalSort(int n) {
int i, j;
// 初始化入度数组
for (i = 0; i < n; i++) {
inDegree[i] = 0;
for (j = 0; j < n; j++) {
if (adjMatrix[j][i] == 1) {
inDegree[i]++;
}
}
}
// 将入度为0的节点加入队列
for (i = 0; i < n; i++) {
if (inDegree[i] == 0) {
queue[rear++] = i;
}
}
// 循环取出队列中的节点,更新相邻节点的入度,将入度为0的节点加入队列
while (front != rear) {
int node = queue[front++];
printf("%d ", node); // 输出拓扑序列
for (i = 0; i < n; i++) {
if (adjMatrix[node][i] == 1) {
inDegree[i]--;
if (inDegree[i] == 0) {
queue[rear++] = i;
}
}
}
}
}
int main() {
int n, m, i, j;
printf("请输入图的节点数和边数:");
scanf("%d %d", &n, &m);
// 初始化邻接矩阵
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
adjMatrix[i][j] = 0;
}
}
printf("请输入每条边的起点和终点:\n");
for (i = 0; i < m; i++) {
int u, v;
scanf("%d %d", &u, &v);
adjMatrix[u][v] = 1;
}
printf("拓扑序列为:");
topologicalSort(n);
return 0;
}
```
在示例代码中,首先使用邻接矩阵存储图,并计算每个节点的入度。然后将入度为0的节点加入队列,循环取出队列中的节点,输出拓扑序列,并更新相邻节点的入度,将入度为0的节点加入队列。最后输出求解得到的拓扑序列。
阅读全文