关于邻接矩阵的拓扑排序

#include <stdio.h>
#include <stdlib.h>
#define MAX 20

int indegree[MAX];//用来计算所有节点的入度之和

typedef  int AdjMatrix[MAX][MAX];
typedef struct{
	int vexnum,arcnum;
	AdjMatrix arcs;
	char vex[MAX];
}MGraph;
typedef struct{
	int *base;
	int top,stacksize;
}SqStack;

int LocateAdj(MGraph G, char v){
	int i;
	
	for(i = 0; i < G.vexnum; i ++)
		if(G.vex[i] == v)
			return i;
	
	return -1; 
}

void CreateMGraph(MGraph &G){
	int i,j,k;
	char v1,v2;
	
	printf("请输入结点数和边的数目:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	
	for(i = 0; i < G.vexnum; i ++)
		for(j = 0; j < G.vexnum; j ++)
				G.arcs[i][j] = 0; //先对矩阵进行初始化
	
	printf("请输入结点:\n");
	getchar();
	for(i = 0; i < G.vexnum; i ++){
		scanf("%c",&G.vex[i]);
	}
	
	printf("请输入各条边:\n");
	for(i = 0; i < G.arcnum; i ++){
		getchar();	
		scanf("%c%c",&v1,&v2);
		
		j = LocateAdj(G,v1);	k = LocateAdj(G,v2);
		
		G.arcs[j][k] = 1;
	}
}

void FindInDegree(MGraph G){//计算图中各节点的入度
	int i,j;
	
	for(i = 0; i < G.vexnum; i ++){
		for(j = 0; j < G.vexnum; j ++)
			if(G.arcs[i][j])//当两顶点之间存在边时,入度自加
				indegree[j] ++;
	}
}

void InitStack(SqStack &S){
	S.base = (int *)malloc(sizeof(int) * MAX);
	
	if(!S.base)
		return ;
	
	S.top = 0;
	S.stacksize = MAX;
}

void Push(SqStack &S, int i){
	if(S.top >= S.stacksize){
		S.base = (int *)realloc(S.base,(S.stacksize + MAX) * sizeof(int));
		
		if(!S.base)
			return ;
		
		S.stacksize += MAX;
	}
	
	S.base[S.top ++] = i;
}

void Pop(SqStack &S, int &i){
	if(!S.top)
		return ;
	
	i = S.base[-- S.top];
}

int StackEmpty(SqStack S){
	if(!S.top)
		return 1;
	return 0;
}

 void TopologicalSort(MGraph G){
	FindInDegree(G);
	
	SqStack S;
	int i,j,count = 0;
	InitStack(S);
	
	for(i = 0; i < G.vexnum; i ++)
		if(!indegree[i])
			Push(S,i);//把入度为零的节点压栈
	
	printf("拓扑序列如下:\n");	
	while(!StackEmpty(S)){
		Pop(S,i);
		printf("%c\n",G.vex[i]);		count ++;
		
		for(j = 0; j < G.vexnum; j ++){
			if(G.arcs[i][j]){
				if(!(-- indegree[j]))//删除相对应得边
					Push(S,j);
			}
		}				
	}

	if(count < G.vexnum)
		printf("此图有环存在!\n");
}

int main(){
	MGraph G;
	
	CreateMGraph(G);
	
	TopologicalSort(G)//对图进行拓扑排序;
	
	return 0;
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/i1020/article/details/53206930
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞