无权无向图的最短路径

无权无向图的最短路径

介绍

广搜BFS思路实现的
主要通过一个结构体和一个临时队列

typedef struct _INFO
{
	int nVertex;
	bool bVisit;
	int nDist;
	int nPath;

}INFO, *PINFO;

nVertex: 顶点索引
bVisit: 是否访问过
nDist: 步数
nPath: 上一个

Demo

typedef struct _INFO
{
	int nVertex;
	bool bVisit;
	int nDist;
	int nPath;

}INFO, *PINFO;

bool BFS(PGRAPH pGraph, char chBegin, char chEnd)
{
	//获取起始索引、结束索引
	int nBeginIndex = -1;
	int nEndIndex = -1;

	for (int i = 0; i < pGraph->vn; i++)
	{
		if (pGraph->vertex[i] == chBegin)
		{
			nBeginIndex = i;
		}
		else if (pGraph->vertex[i] == chEnd)
		{
			nEndIndex = i;
		}

		if (nBeginIndex != -1 && nEndIndex != -1)
		{
			break;
		}
	}
	if (nBeginIndex == -1 || nEndIndex == -1)
	{
		return false;
	}

	INFO info[100] = { 0 };
	info[nBeginIndex].nVertex = nBeginIndex;
	info[nBeginIndex].bVisit = true;
	info[nBeginIndex].nDist = 0;
	info[nBeginIndex].nPath = nBeginIndex;

	//临时队列
	std::queue<int> q;
	q.push(nBeginIndex);

	while (q.empty() == false)
	{
		//出队
		int x = q.front();
		q.pop();

		//遍历该节点指向的其他节点
		for (int i = 0; i < pGraph->vn; i++)
		{
			//判断是否指向该节点
			if (pGraph->edge[x][i] == false)
			{
				continue;
			}

			//指向
			//判断是否已搜索过
			if (info[i].bVisit == true)
			{
				//访问过
				//判断覆盖是否大于或等于
				if (info[x].nDist + 1 > info[i].nDist)
				{
					//大于或等于就没必要覆盖了
					continue;
				}
			}

			q.push(i);

			//未访问过
			info[i].nVertex = i;
			info[i].bVisit = true;
			info[i].nDist = info[x].nDist + 1;
			info[i].nPath = x;
		}
	}

	//这里就是按顺序打印了
	std::stack<int> st;
	for (int i = nEndIndex; ; i = info[i].nPath)
	{
		st.push(info[i].nVertex);
		if (i == nBeginIndex)
		{
			break;
		}
	}

	while (st.empty() == false)
	{
		std::cout << pGraph->vertex[st.top()] << " ";
		st.pop();
	}
	std::cout << std::endl;

	return true;
}

调用

BFS(pGraph, 'a', 'b');

具体代码可看上一节: 数据结构-无权无向图.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值