数据结构之拓扑排序

拓扑排序

在一个表示工程的有向图中,有顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。AOV网中的弧表示活动之间存在的某种制约关系。

对AOV网进行拓扑排序的基本思路:

从AOV网中选择一个入度为0的顶点输出;

然后删除此顶点,并删除以次顶点为尾的弧;

继续重复此操作.....

直到输出全部顶点或AOV网中不存在入度为0的顶点为止。

由于拓扑排序过程中,需要删除顶点,显然用邻接表更加方便。

因此我们需要为AOV网建立一个邻接表。

另外,考虑到算法过程中始终需要查找入度为0的顶点?

需要在原顶点表节点结构中,增加一个入度域in,in就是入度数字。

所以结构如下图:



typedef struct EdgeNode		/*边表结点*/
{
	int adjvex;	/*邻接点域,存储该顶点对应的下标*/
	int weight;	/*用于存储权值,对于非网图可以不需要*/
	struct EdgeNode *next;	/*链域,指向下一个邻接点*/
}EdgeNode;

typedef struct VertexNode
{
    int in;
    int data;	/*邻接点域*/
	EdgeNode *firstedge;	/*边表头指针*/
}VertexNode,AdjList[MAXVEX];

typedef struct GraphAdjList
{
	AdjList adjlist;
	int numVertexes, numEdges;	/*图中当前顶点数和边数*/
}GraphAdjList;

/* 拓扑排序,若GL无回路,则输出拓扑排序序列并返回1,若有回路返回0。 */
Status TopologicalSort(GraphAdjList GL)
{    
	EdgeNode *e;    
	int i,k,gettop;   
	int top=0;  /* 用于栈指针下标  */
	int count=0;/* 用于统计输出顶点的个数  */    
	int *stack;	/* 建栈将入度为0的顶点入栈  */   
	stack=(int *)malloc(GL->numVertexes * sizeof(int) );    
 
	for(i = 0; i<GL->numVertexes; i++)                
		if(0 == GL->adjList[i].in) /* 将入度为0的顶点入栈 */         
			stack[++top]=i;    
	while(top!=0)    
	{        
		gettop=stack[top--];        
		printf("%d -> ",GL->adjList[gettop].data);        
		count++;        /* 输出i号顶点,并计数 */        
		for(e = GL->adjList[gettop].firstedge; e; e = e->next)        
		{            
			k=e->adjvex;            
			if( !(--GL->adjList[k].in) )  /* 将i号顶点的邻接点的入度减1,如果减1后为0,则入栈 */                
				stack[++top]=k;        
		}
	}   
	printf("\n");   
	if(count < GL->numVertexes)        
		return ERROR;    
	else       
		return OK;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值