数据结构----图的遍历(DFS)

问题描述:


采用邻接表的存储结构,编写一个算法,判别无向图中任意给定的啷个顶点之间是否存在一条长度为 k 的简单路径。

完整代码:

#include<cstdio>
#include<cstring>
#define Maxnum 100
//边结点 
typedef struct ArcNode
{
	int adjvex;//边结点在顶点表中的下标 
	struct ArcNode *next; 
} ArcNode;

//顶点
typedef struct VNode
{
	char data;
	ArcNode * firstarc;
}VNode;

//邻接表
typedef  struct
{
	VNode vertex[Maxnum];
	int vernum;
	int arcnum;
}ALGraph;

//find 函数,查找数据域为e的顶点下标 
int find(ALGraph G, char e)
{
	for(int i=0; i<G.vernum; i++)
	{
		if(G.vertex[i].data==e)
		return i;
	}
	return -1;
} 



//创建无向图邻接表
void createAlGraph(ALGraph &G)
{
	scanf("%d%d", &G.vernum, &G.arcnum);
	getchar();
	for(int i=0; i<G.vernum; i++)
	{
		//输入顶点信息
		scanf("%c", &G.vertex[i].data);
		getchar();
		G.vertex[i].firstarc=NULL;
	}
	ArcNode *p;
	for(int i=0; i<G.arcnum; i++)
	{
		char v1, v2;
		scanf("%c %c", &v1, &v2);
		getchar();
		int j = find(G, v1);
		int k = find(G, v2);
		
		//将k加到j的边结点中 
		p = new ArcNode;
		p->adjvex = k;
		p->next = G.vertex[j].firstarc;
		G.vertex[j].firstarc = p; 
		
		//将j加到k的边结点中
		p=new ArcNode;
		p->adjvex = j;
		p->next = G.vertex[k].firstarc;
		G.vertex[k].firstarc = p; 
	}
 } 

//标志数组,表征顶点的访问与否
bool visited[Maxnum]; 

//查找无向图中是否存在一条以i为起点,j为终点,长度为k的简单路径 
bool path_is_existence(ALGraph G,int i,int j,int k) 
{

	if(i==j && k==0)
		return 1;
	else if(k>0)
	{
		//标记为已访问
		visited[i] = 1;
		ArcNode *p = G.vertex[i].firstarc;
		while(p)
		{
			if(!visited[p->adjvex])
				{
					//如果与 i 邻接的顶点到 j 之间存在一条长度为 k-1 的简单路径,函数返回1(缩小了问题规模)
					if( path_is_existence(G, p->adjvex, j, k-1) )
							return 1;
				}
			//p指向下一个与i相邻的顶点	 
			p = p->next;
		}
		//没有找到,visited[i]要重新赋值为0,可能从其他路径通过该点到达终点
		visited[i] = 0;		
	}
	//没有找到,返回 0
	return 0;
	
//注意: 递归程序的出口和状态转移	
	
}
 
int main()
{
	ALGraph G;
	createAlGraph(G);
	memset(visited, 0, sizeof(visited));
	int i, j, k;
	scanf("%d%d%d", &i, &j, &k);
	printf("%d", path_is_existence(G, i, j, k));
	return 0;
}

(测试用例输入图示)

《数据结构----图的遍历(DFS)》

测试结果:

《数据结构----图的遍历(DFS)》

注:输出 结果中(1表示存在 ,0表示不存在)指定路径

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/foreverzili/article/details/78881616
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞