C语言实现有向无环图的拓扑排序算法
来源:互联网 发布:网络买卖合同律师365 编辑:程序博客网 时间:2024/05/16 13:57
对AOV网进行拓扑排序的基本思路是:从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或者在AOV网中不存在入度为0的顶点为止。
这里图使用的数据结构是邻接表,并且在顶点表加入顶点入度一项。
以下程序在DEV C++中编译运行通过。
#include <stdio.h>#include <stdlib.h>#define MAXVEX 20typedef struct EdgeNode{int adjvex;//邻接点域,存储该顶点对应的下标 struct EdgeNode *next;//链域,指向下一个邻接点 }EdgeNode;typedef struct VertexNode{int in;//顶点入度char 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);getchar();for(i=0;i<G->numVertexes;i++){printf("输入第%d个顶点的值和入度:\n",i+1);scanf("%c,%d",&G->adjList[i].data,&G->adjList[i].in);G->adjList[i].firstedge=NULL;getchar();}for(k=0;k<G->numEdges;k++){printf("输入第%d条有向边(vi,vj)上的顶点序号:\n",k+1);scanf("%d,%d",&i,&j);e=(EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex=j;e->next=G->adjList[i].firstedge;G->adjList[i].firstedge=e;}}int TopologicalSort(GraphAdjList *G){EdgeNode *e;int i,k,gettop;int top=0;//用于栈指针下标int count=0;//用于统计输出顶点的个数int *Stack;//建栈存储入度为0的指针Stack=(int*)malloc(G->numVertexes*sizeof(int));for(i=0;i<G->numVertexes;i++){if(G->adjList[i].in==0)Stack[++top]=i;//将入度为0的顶点的序号入栈 } while(top!=0) { gettop=Stack[top--]; printf("%c->",G->adjList[gettop].data); count++; for(e=G->adjList[gettop].firstedge;e;e=e->next) { //对此顶点的弧表进行遍历 k=e->adjvex;//邻接点的序号 if(!(--G->adjList[k].in)) Stack[++top]=k; } } if(count<G->numVertexes) return -1;else return 0;}void main(){GraphAdjList G;int flag;CreateALGraph(&G);flag=TopologicalSort(&G);if(flag==-1)printf("该有向图存在环,构造拓扑序列失败!\n");else if(flag==0)printf("构造拓扑序列成功!\n");}
运行结果如图所示。
求出的结果不是唯一的拓扑排序方案。
整个算法的时间复杂度为O(n+e),n是顶点数,e是边数。
阅读全文
0 0
- C语言实现有向无环图的拓扑排序算法
- 有向无回路图的拓扑排序 C语言实现
- 有向图的拓扑排序算法的C程序实现代码
- 有向图的拓扑排序算法JAVA实现
- 算法 有向无环图 拓扑排序
- 算法: 有向无环图(DAG)的拓扑排序
- 图之有向无环图的应用--拓扑排序算法的实现
- 数据结构与算法——有向无环图的拓扑排序C++实现
- 有向无环图的拓扑排序
- 有向无环图的拓扑排序
- 有向无环图的拓扑排序
- 【图论】有向无环图的拓扑排序
- 数据结构与算法之有向图的拓扑排序
- java数据结构与算法-有向图的拓扑排序
- 拓扑排序的c语言实现
- 拓扑排序的c语言实现
- 拓扑排序的c语言实现
- C语言拓扑排序的实现
- Redis 持久化
- java读写TXT文件
- Head First Java#10_数字与静态
- java List几种遍历方法
- 改善C#程序,提高程序运行效率的50种方法
- C语言实现有向无环图的拓扑排序算法
- ping工作过程
- Android
- 程序员面试-数据库3
- python读excel两种方式
- send(),recv()函数
- HTML5_网页基础
- MySQL外键级联操作
- 创建型模式-单例模式