栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

DFS遍历连通图

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

DFS遍历连通图

//深度优先搜索遍历连通图的递归算法
#include
using namespace std;
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct {
	VerTexType vexs[MVNum]; // 顶点表
	ArcType arcs[MVNum][MVNum]; // 邻接矩阵
	int vexnum, arcnum;
}Graph;
bool visited[MVNum]; // 访问标志数组
int FirstAdjVex(Graph G, int v); // 返回v的第一个邻接点
int NextAdjVex(Graph G, int v, int w); // 返回v相对于w的下一个邻接点
int LocateVex(Graph G, VerTexType v)
{
	for (int i = 0; i < G.vexnum; i++)
	{
		if (G.vexs[i] == v)
		{
			return i;
		}
		return -1;
	}
}
void CreateUDN(Graph& G)
{
	cout << "请输入总顶点数,总边数:";
	cin >> G.vexnum >> G.arcnum;
	cout << endl;
	cout << "请输入点的名称" << endl;
	for (int i = 0; i < G.vexnum; i++)
	{
		cout << "请输入第" << i + 1 << "个点的名称:";
		cin >> G.vexs[i];
	}
	for (int i = 0; i < G.vexnum; i++)
	{
		for (int j = 0; j < G.vexnum; j++)
		{
			G.arcs[i][j] = 0;
		}
	}
	cout << "输入边依附的顶点" << endl;
	for (int k = 0; k < G.arcnum; k++)
	{
		VerTexType v1, v2;
		cout << "请输入第" << k + 1 << "条边依附的顶点:";
		cin >> v1 >> v2;
		int i = LocateVex(G, v1);
		int j = LocateVex(G, v2);
		G.arcs[j][i] = G.arcs[i][j] = 1;
	}
}
void DFS(Graph G, int v)
{
	cout << G.vexs[v] << " ";
	visited[v] = true;
	for (int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
	{
		if (!visited[w])
		{
			DFS(G, w);
		}
	}
}
int FirstAdjVex(Graph G, int v)
{
	for (int i = 0; i < G.vexnum; i++)
	{
		if (G.arcs[v][i] == 1 && visited[i] == false)
		{
			return i;
		}
	}
	return -1;
}
int NextAdjVex(Graph G, int v, int w)
{
	for (int i = w; i < G.vexnum; i++)
	{
		if (G.arcs[v][i] == 1 && visited[i] == false)
		{
			return i;
		}
	}
	return -1;
}
int main()
{
	cout << "DFS遍历连通图的递归算法" << endl;
	Graph G;
	CreateUDN(G);
	cout << "请输入遍历连通图的起始点:";
	VerTexType c;
	cin >> c;
	int i;
	for(i = 0; i < G.vexnum; i++)
	{
		if (c == G.vexs[i])
		{
			break;
		}
	}
	while (i >= G.vexnum)
	{
		cout << "该点不存在,请重新输入! " << endl;
		cout << "请输入遍历连通图的起始点:" << endl;
		cin >> c;
		for (i = 0; i < G.vexnum; i++)
		{
			if (c == G.vexs[i])
			{
				break;
			}
		}
	}
	cout << "深度优先搜索遍历连通图的结果:" << endl;
	DFS(G, i);
	cout << endl;
	return 0;
}



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664200.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号