分别采用深度优先遍历和广度优先遍历判断是否存在由vi到vj的路径,图用邻接表存储

分析:
        采用深度优先:我们从vi顶点开始进行深度遍历,若存在路径则必然可以走到vj顶点处;
        采用广度优先:同样从vi顶点开始进行广度遍历,若存在则必然可以走到vj顶点处。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#define MAXSIZE 100
#include <stdio.h>
#include <stdlib.h>
typedef struct EdgeNode {//边表结点
	int index;//该边所指向的顶点的位置
	int weight;//权值
	EdgeNode *next;//下一个邻接边
}EdgeNode;

typedef struct VertexNode {//顶点表节点
	char info;//顶点信息
	EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针
}VertexNode, Adjlist[MAXSIZE];

typedef struct {
	Adjlist adjlist;//顶点数组
	int numE, numV;//边数、顶点数
}ALGraph;
//链队
struct Link {
	int node;//我们进行广度优先时会用到,将顶点序号入队
	struct Link *next;
};
struct LinkQueue {
	struct Link *front, *rear;
};

void DFS(ALGraph *G, int vi, int vj, int *visited, int &flag) {
	for (EdgeNode *p = G->adjlist[vi].firstEdge; p; p = p->next) {
		if (!visited[p->index]) {
			visited[p->index] = 1;
			if (p->index == vj) {
				flag = 1;
			}
			DFS(G, p->index, vj, visited, flag);
		}
	}

}
bool judgeRouteInDFS(ALGraph *G, int vi, int vj) {//传入图G,路线端点vi vj
	int *visited = (int *)malloc(sizeof(int)*G->numV);
	int flag = 0;//进入递归,路径存在标志
	for (int i = 0; i < G->numV; i++) {
		visited[i] = 0;//初始化
	}
	if (!visited[vi]) {
		visited[vi] = 1;
		DFS(G, vi, vj, visited, flag);
	}
	if (flag) {
		return 1;

	}
	else {
		return 0;
	}

}

bool judgeRouteInBFS(ALGraph *G, int vi, int vj) {
	int *visited = (int *)malloc(sizeof(int)*G->numV);
	int flag = 0;//进入递归,路径存在标志
	int index;//进行判断用
	for (int i = 0; i < G->numV; i++) {
		visited[i] = 0;//初始化
	}
	bool isEmpty(LinkQueue *lq);
	bool enQueue(LinkQueue *, int);
	bool deQueue(LinkQueue *, int*);
	LinkQueue *create();//声明创建队列的方法。广度优先遍历需要用到队列
	LinkQueue *lq;
	lq = create();
	if (!visited[vi]) {
		visited[vi] = 1;
		enQueue(lq, vi);//入队
	}
	while (!isEmpty(lq)) {//当队列不空,取出队首元素进行判断
		deQueue(lq, &index);
		if (!visited[index]) {//若未曾访问过,进行判断
			visited[index] = 1;
			if (vj == index) {
				flag = 1;
			}
		}
		for (EdgeNode *p = G->adjlist[index].firstEdge; p; p = p->next) {
			if (!visited[p->index]) {
				enQueue(lq, p->index);//把所有的未访问过得邻接顶点入队

			}
		}
	}
	if (flag) {
		return 1;

	}
	else {
		return 0;
	}
}
int main() {
	int haveRoute;
	void createGraphInFile(ALGraph *G);
	ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph *));
	createGraphInFile(G);//创建图
	int vi, vj;
	printf("请输入vi,vj\n");
	printf("vi= ");
	scanf("%d", &vi);
	printf("vj= ");
	scanf("%d", &vj);
	while (vi >= G->numV || vj >= G->numV) {
		printf("输入有误,不存在该顶点,请重新输入!");
		printf("vi= ");
		scanf("%d", &vi);
		printf("vj= ");
		scanf("%d", &vj);
	}
	haveRoute = judgeRouteInBFS(G, vi - 1, vj - 1);
	if (haveRoute) {
		printf("顶点%d到顶点%d存在路径", vi, vj);
	}
	else {
		printf("%d到%d不存在路径", vi, vj);
	}
	return 0;
}

 人的一生应当这样度过:当一个人回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧;这样,在他临死的时候,能够说,我把整个生命和全部精力都献给了人生最宝贵的事业——为人类的解放而奋斗. ----保尔 柯察金

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值