圖:在鄰接矩陣上實現拓撲排序(C語言)

拓撲排序:

用於排列事件發生的順序,也可判斷圖中是否有環。

代碼實現:

#include<stdio.h>
#include<stdlib.h>
#define MaxVexNum 50
#define MaxInt 32767
#define MaxEdgeNum 50
//鄰接矩陣
typedef int VertexType;
typedef int EdgeType;
typedef struct AMGraph{
	VertexType vexs[MaxVexNum];//頂點表 
	EdgeType arcs[MaxVexNum][MaxVexNum];//鄰接矩陣表 
	int vexnum,edgenum;//頂點數,邊數 
}AMGraph; 

void createGraph(AMGraph &g){//創建無向圖 
	printf("請輸入頂點數:");
	scanf("%d",&g.vexnum);
	printf("\n請輸入邊數:");
	scanf("%d",&g.edgenum);
	
	//初始化頂點表 
	for(int i=1;i<=g.vexnum;i++){
		g.vexs[i]=i; 
	} 
	for(int i=1;i<=g.vexnum;i++){
		for(int j=1;j<=g.vexnum;j++){
			g.arcs[i][j]=MaxInt;
			if(i==j) g.arcs[i][j]=0;
		}
	} 
	printf("請輸入邊的信息以及邊的權值(頂點是0~n-1)\n");
	for(int i=0;i<g.edgenum;i++){
		int x,y,w;
		scanf("%d%d%d",&x,&y,&w);
		g.arcs[x][y]=w;
		//g.arcs[y][x]=w;
	}
}
void PrintGraph(AMGraph g){
	printf("鄰接矩陣爲:\n");
	for(int i=1;i<=g.vexnum;i++) {
		printf("  %d",g.vexs[i]);
	}
	printf("\n");
	for(int i=1;i<=g.vexnum;i++){
		printf("%d ",g.vexs[i]);
		for(int j=1;j<=g.vexnum;j++){
			if(g.arcs[i][j]==32767){
				printf("∞ "); 
			}else{
				printf("%d  ",g.arcs[i][j]);
			}	
		}
		printf("\n");
	} 
}
void updateStack(int stack[],int &top,int set[],AMGraph &g){
	for(int i=1;i<=g.vexnum;i++){
		int count=0;
		for(int j=1;j<=g.vexnum;j++){
			if(set[i]==0&&i!=j&&g.arcs[j][i]==MaxInt){
				count++;
			}
		}
		if(count==g.vexnum-1){
			stack[++top]=i;
			set[i]=1;
		}	
	}
} 
//拓撲排序
//用於排列活動發生的先後次序
//也可判斷圖中是否有環 
void TopSort(AMGraph g,int topsort[]){
	AMGraph temp=g;
	int stack[g.vexnum];
	int top=-1;
	int top1=0;//將拓撲序列存入 
	
	int set[g.vexnum+1];//標記數組 
	for(int i=1;i<=g.vexnum;i++) set[i]=0;
	for(int i=1;i<=g.vexnum;i++){
		int count=0;
		for(int j=1;j<=g.vexnum;j++){
			if(set[i]==0&&i!=j&&g.arcs[j][i]==MaxInt){
				count++;
			}
		}
		if(count==g.vexnum-1){
			stack[++top]=i;
			set[i]=1;
		}	
	}
	printf("拓撲排序序列爲:"); 
	
	while(top!=-1){
		int e=stack[top--];
		printf("%d  ",e);
		topsort[++top1]=e;
		//更新
		for(int i=1;i <= temp.vexnum;i++){
		    if(i!=e)	temp.arcs[e][i]=MaxInt;
		} 
		//更新棧
		updateStack(stack,top,set,temp); 	 
	}
	
	
}
void KeyPath(){
	
} 
int main(){
	AMGraph g;
	createGraph(g);
	PrintGraph(g);
	int topsort[g.vexnum+1];

	TopSort(g,topsort);
	

	
	
	 
} 

代碼運行截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章