無向圖的深度優先搜索與有向圖的廣度優先搜索

 無向圖的深度優先搜索與有向圖的廣度優先搜索

圖採用鄰接矩陣表示,實現無向圖的深度優先搜索與有向圖的廣度優先搜索。

#include "stdio.h"
#include "stdlib.h"
#define MAX_VERTEX_NUM 20//最大頂點個數 
typedef struct {
	char vexs[MAX_VERTEX_NUM];//存放節點 
	int visited[MAX_VERTEX_NUM];//訪問標誌
	int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
	int vexnum,arcnum;//結點個數,邊的個數 
}mgraph,*Mgraph;


//廣度優先遍歷需要的循環隊列
typedef struct {
    int base[MAX_VERTEX_NUM];
    int front,rear;
}SqQueue;

void InitQueue(SqQueue *Q){
    Q->front = Q->rear = 0;
}

void EnQueue(SqQueue *q,int e){
	q->base[q->rear]=e;
	q->rear++;
}

void DeQueue(SqQueue *q,int *e){
	*e=q->base[q->front];
	q->front++;
}

int emptyQueue(SqQueue *q){			//隊列是否滿函數 
	if((q->rear+1)%(MAX_VERTEX_NUM-1)==q->front)
		return 1;
	return 0;
}


//增加節點 
void add_vexs(Mgraph *g){
	
	char c;
	printf("請輸入節點值,以#結束: \n");
	scanf("%c",&c);
	while(c!='#'){
		(*g)->vexs[(*g)->vexnum]=c;
		(*g)->vexnum++;//累計結點個數 
		getchar();
		scanf("%c",&c);
	}	
	printf("輸入完畢!!!\n");
	printf("%d\n",(*g)->vexnum); 
} 
//無向圖增加邊 
void add_arc_w(Mgraph *g){
	char v1,v2;
	int row=0,col=0;
	printf("請輸入邊的個數:\n");
	scanf("%d",&((*g)->arcnum));
	printf("請輸入每條邊的端點\n");  
	for(int i=0;i<(*g)->arcnum;i++)//控制邊的個數 
	{
		getchar();
		scanf("%c %c",&v1,&v2);
		for(int j = 0; j < (*g)->vexnum; j++)
		{
			if((*g)->vexs[j] == v1)
				row = j;		
			if((*g)->vexs[j] == v2)
				col=j;	
		}
		(*g)->matrix[row][col] = 1;  
    	printf("matrix[%d][%d]=1\n",row,col);
        (*g)->matrix[col][row] = 1;//行和列在無向圖的鄰接矩陣是對稱的 
	} 	 
	
} 
//有向圖增加邊
void add_arc_y(Mgraph *g) {
	char v1,v2;
	int row=0,col=0;
	printf("請輸入邊的個數:\n");
	scanf("%d",&((*g)->arcnum));
	printf("請輸入每條邊的端點\n");  
	for(int i=0;i<(*g)->arcnum;i++)//控制邊的個數 
	{
		getchar();
		scanf("%c %c",&v1,&v2);
		for(int j = 0; j < (*g)->vexnum; j++)
		{
			if((*g)->vexs[j] == v1)
				row = j;		
			if((*g)->vexs[j] == v2)
				col=j;	
		}
		(*g)->matrix[row][col] = 1;  
        printf("matrix[%d][%d]=1\n",row,col); 
	} 	 
}

//初始化圖
void init_mgraph(Mgraph *g){
	int i,j;
	(*g)=(Mgraph)malloc(sizeof(mgraph));
	(*g)->vexnum=(*g)->arcnum=0;
	for(i=0;i<MAX_VERTEX_NUM;i++){
		(*g)->vexs[i]=0;//節點值初始化爲0
		(*g)->visited[i] = 0;//訪問標誌初始化爲0
	} 
	for(i=0;i<MAX_VERTEX_NUM;i++)
		for(j=0;j<MAX_VERTEX_NUM;j++){
			(*g)->matrix[i][j]=0;//初始化矩陣 
		}
	add_vexs(g);
	add_arc_w(g);
}

 
void visited(Mgraph *g,int i)
{
	printf("%c ",(*g)->vexs[i]);
	(*g)->visited[i] = 1;
}
//深度遍歷算法 
void DFS(Mgraph *g,int i)
{
	visited(g,i);
	for (int j = 0; j < (*g)->vexnum; j++)
	{
		if((*g)->matrix[i][j] && !(*g)->visited[j])
		{
 			DFS(g,j); //對v的尚未訪問的鄰接頂點w
	 	}
	}
}
void DFSTraverse(Mgraph *g){
    int i;
    for (i=0; i<(*g)->vexnum; ++i){
        if (!(*g)->visited[i])
            DFS(g, i);	//對尚未訪問的頂點調用DFS
    }
}

//廣度遍歷算法 
void BFS(Mgraph *g,int nowi,SqQueue *Q){
	int i,j;
	for(i=nowi;i<(*g)->vexnum;i++) 
	{
		if(!(*g)->visited[i]){
			visited(g,i);
			EnQueue(Q,i);//入隊 
			while(!emptyQueue(Q)){
				DeQueue(Q,&i);//隊首元素出隊置爲u
			  	for (j=0; j<(*g)->vexnum; ++j){
                    if (!(*g)->visited[j] && (*g)->matrix[i][j]){
                        visited(g,j);
                        EnQueue(Q,j);
                    }//if
               	}//for
           	}
		}//if
	}//for 
}//BFS 
void BFSTraverse(Mgraph *g){
	SqQueue Q;
	InitQueue(&Q);
    int i;
    for (i=0; i<(*g)->vexnum; ++i){
        if (!(*g)->visited[i])
            BFS(g,i,&Q);	//對尚未訪問的頂點調用DFS
    }

}

//打印鄰接矩陣 
void print_mgraph(Mgraph g){
	printf("鄰接矩陣爲:\n");
	for(int i=0;i<g->vexnum;i++){
		printf("%3c",g->vexs[i]);
	}
	printf("\n");
	for(int i=0;i<g->vexnum;i++){
		printf("%c ",g->vexs[i]);
		for(int j=0;j<g->vexnum;j++){
			printf("%2d ",g->matrix[i][j]);
		}
		printf("\n");
	}
}

int main(){
	Mgraph g1,g2;//g1爲無向圖,g2爲有向圖 
	init_mgraph(&g1);
	print_mgraph(g1); 
	printf("圖的DFS遍歷結果:\n");
	DFSTraverse(&g1);
	
	getchar();
	printf("\n");
	
	init_mgraph(&g2);
	print_mgraph(g2); 
	printf("圖的BFS遍歷結果:\n");
	BFSTraverse(&g2);
	return 0;
	
}

 

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