图的深度优先遍历和广度优先遍历

深度优先遍历连通图的一种遍历策略。其基本思想如下:

       设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。

广度优先遍历连通图的一种遍历策略。其基本思想如下:

1、从图中某个顶点V0出发,并访问此顶点;

2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;

3、重复步骤2,直到全部顶点都被访问为止。

#include<stdio.h>

#define VERTEXNUM  100

int alskim[VERTEXNUM];
int alnum;
int Queue[VERTEXNUM];
int front, rear;

typedef struct node {
	int numvector;//顶点数
	int numedge;  //边数
	int vector[VERTEXNUM]; //顶点记录
	int edge[VERTEXNUM][VERTEXNUM];//邻接矩阵
} Graph, *Graphp; //邻接矩阵表示图


void createGraph(Graphp Graphcase, int start, int end);
void init_Graph(Graphp Graphcase);
void print_edge(Graphp Graphcase);
void DFSGraph(Graphp Graphcase, int vector);
int checkrepeat(int alskim[VERTEXNUM], int alnum, int vi);
void BFSGraph(Graphp Graphcase, int vector);

int main()
{
	Graph Graphcase;
	int i, j;
	
	printf("please input the num of the vector\n");
	scanf("%d", &Graphcase.numvector);

	printf("please input the num of the edge\n");
	scanf("%d", &Graphcase.numedge);
	printf("please input the edge\n");
	for(i = 0; i < Graphcase.numedge; i++)
		for(j = 0; j < Graphcase.numedge; j++)
			Graphcase.edge[i][j] = 0;
	
	init_Graph(&Graphcase);
//	print_edge(&Graphcase);
	printf("please input the begining\n");
	scanf("%d", &i);

	printf("\nBFSGraph is");
	alskim[alnum++] = i;
	BFSGraph(&Graphcase, i);
	for(j = 0; j < alnum; j++)
			printf("%d", alskim[j]);
	printf("\n");

	alnum = 0;
	printf("\nDFSGraph is");
	alskim[alnum++] = i;
	DFSGraph(&Graphcase, i);
	for(j = 0; j < alnum; j++)
			printf("%d ", alskim[j]);
	printf("\n");

	return 0;
}

void createGraph(Graphp Graphcase, int start, int end)
{
	Graphcase->edge[start][end] = 1;
	Graphcase->edge[end][start] = 1;
}

void init_Graph(Graphp Graphcase)
{
	int i;
	int vector1, vector2;
	for(i = 0; i < Graphcase->numedge; i++) {
		scanf("%d%d", &vector1, &vector2);
		createGraph(Graphcase, vector1, vector2);
	}
}

void print_edge(Graphp Graphcase)
{
	int i, j;
	for(i = 0; i < Graphcase->numvector; i++) {
		for(j = 0; j < Graphcase->numvector; j++) 
		printf("%d ", Graphcase->edge[i][j]);
		printf("\n");
	}
}

void DFSGraph(Graphp Graphcase, int vector)//图的深度优先遍历
{
	int i;
	for(i = 0; i < Graphcase->numvector; i++) {
		if((Graphcase->edge[i][vector] == 1) && (checkrepeat(alskim, alnum, i) > 0)) {
			alskim[alnum++] = i;
			DFSGraph(Graphcase, i);
		}
	}
}

int checkrepeat(int alskim[VERTEXNUM], int alnum, int vi)//查看是否已经遍历过
{
	int j;
	for(j = 0; j< alnum; j++) {
		if(alskim[j] == vi)
			return -1;
	}
	return 1;
}


void BFSGraph(Graphp Graphcase, int vector) //广度优先遍历图
{
	int i, j;
	int vector1;

	for(i = 0; i < Graphcase->numvector; i++)
		if((Graphcase->edge[i][vector] == 1) && (checkrepeat(alskim, alnum, i) > 0)) {
			alskim[alnum++] = i;
			Queue[front++] = i;
		}
		while(rear != front) {
			vector1 = Queue[rear++];
			for(i = 0; i < Graphcase->numvector; i++)
				if((Graphcase->edge[i][vector1] == 1) && (checkrepeat(alskim, alnum, i) > 0)) {
					alskim[alnum++] = i;
					Queue[front++] = i;
				}
		}
		
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值