逆拓扑排序(DFS算法)

void DFSTraverse(Graph G) {   //对图G进行深度优先遍历
	for (v = 0; v < G.vexnum; ++v)
		visited[v] = FALSE;   //初始化已访问标记数据
	for (v = 0; v < G.vexnum; ++v)  //本代码中是从v=0开始遍历
		if (!visited[v])
			DFS(G, v);
}
void DFS(Graph G, int v) {  //从顶点v出发,深度优先遍历图G
	visited[v] = TRUE;     //设已访问标记
	for (w = FirstNeighbor(G, v); W >= 0; w = NextNeighor(G, v, W))
		if (!visited[w]) {  //w为u的尚未访问的邻接顶点
				DFS(G, W);
		} //if
	print(v);   //输出顶点
}
以下是拓扑排序算法的C语言实现: ```c #include <stdio.h> #define MAXVEX 100 // 最大顶点数 typedef struct EdgeNode { // 边表节点 int adjvex; // 邻接点域,存储该顶点对应的下标 struct EdgeNode *next; // 链域,指向下一个邻接点 } EdgeNode; typedef struct VertexNode { // 顶点表结构 int in; // 顶点入度 int data; // 顶点域,存储顶点信息 EdgeNode *firstedge; // 边表头指针 } VertexNode, AdjList[MAXVEX]; typedef struct { // 图结构 AdjList adjList; int numVertexes, numEdges; // 图中当前顶点数和边数 } GraphAdjList; void CreateALGraph(GraphAdjList *G) { // 建立图的邻接表结构 int i, j, k; EdgeNode *e; printf("请输入顶点数和边数:\n"); scanf("%d%d", &G->numVertexes, &G->numEdges); for (i = 0; i < G->numVertexes; i++) { // 输入顶点信息,建立顶点表 printf("请输入第%d个顶点:", i + 1); scanf("%d", &G->adjList[i].data); G->adjList[i].in = 0; // 初始化所有顶点入度为0 G->adjList[i].firstedge = NULL; // 初始化所有边表为空 } for (k = 0; k < G->numEdges; k++) { // 建立边表 printf("请输入边(vi, vj)上的顶点序号:\n"); scanf("%d%d", &i, &j); e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = G->adjList[i].firstedge; G->adjList[i].firstedge = e; G->adjList[j].in++; // 对应顶点入度加1 } } void TopologicalSort(GraphAdjList G) { // 拓扑排序 int i, j, k, top = 0; int *stack; // 存储入度为0的顶点 EdgeNode *e; stack = (int *)malloc(G.numVertexes * sizeof(int)); for (i = 0; i < G.numVertexes; i++) { // 将所有入度为0的顶点入栈 if (G.adjList[i].in == 0) { stack[++top] = i; } } while (top != 0) { // 栈不为空 j = stack[top--]; // 出栈一个顶点 printf("%d ", G.adjList[j].data); // 输出该顶点 for (e = G.adjList[j].firstedge; e; e = e->next) { // 将该顶点的所有邻接点入度减1 k = e->adjvex; if (--G.adjList[k].in == 0) { // 若邻接点入度为0,则入栈 stack[++top] = k; } } } } int main() { GraphAdjList G; CreateALGraph(&G); printf("拓扑排序结果为:"); TopologicalSort(G); printf("\n"); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值