
/* 分别采用深度优先遍历和广度优先遍历判断是否存在由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);//把所有的未访问过得邻接顶点入队 } } } return flag;}int main() { int haveRoute; void createGraphInFile(ALGraph *); 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); haveRoute = judgeRouteInDFS(G, vi - 1, vj - 1); if (haveRoute) { printf("顶点%d到顶点%d存在路径", vi, vj); } else { printf("%d到%d不存在路径", vi, vj); } return 0;}