关于邻接矩阵的拓扑排序

 

 

 

 

#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);
       // printf("%d  %d****\n",j,k);
		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;
}

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值