【数据结构】利用BFS广度优先搜索算法和DFS深度度优先搜索算法判断无向图是否为树

一、测试数据

在这里插入图片描述
在这里插入图片描述

二、测试效果

在这里插入图片描述
在这里插入图片描述

三、源代码

采用邻接链表储存方式
无向图是树的两个条件:①图连通;②|V|=|E|+1

  • 链表结点
struct AdjNode
{
	char data;   //结点内容
	int index;     //结点编号
	int num;      //到邻接结点的路径数量
	AdjNode* next; //指向邻接结点
};
  • 邻接链表
struct AdjList
{
	AdjNode node;//头结点
	bool isvisted;//是否被访问
};
  • 封装好的无向图类
class UDG
{
public:
	UDG();
	~UDG();
	bool bfs();
	bool dfs();
protected:
	int bfs(int i);
	int dfs(int i);
private:
	struct AdjList* list;
	int V_num;      //结点数目
};
  • 构造函数,初始化工作
UDG::UDG()
{
	cout << "请输入所有顶点数:";
	cin >> V_num;
	list = new AdjList[V_num];
	cout << "请依次输入每个顶点的名称:" << endl;
	for (int i = 0; i < V_num; i++)
	{
		cin >> list[i].node.data;
		list[i].node.index = i + 1;
		list[i].node.next = NULL;
	}
	for (int i = 0; i < V_num; i++)
	{
		int size;
		cout << "请输入第" << i + 1 << "个顶点的邻接点数量:";
		cin >> size;
		for (int j = 1; j <= size; j++)
		{
			int index, E_num;
			cout << "请依次输入第"<<j<<"个邻接点的编号,到达该邻接点的边数:";
			cin >> index >> E_num;
			AdjNode* p = new AdjNode;
			p->index = index;
			p->num = E_num;
			p->next = list[i].node.next;
			list[i].node.next = p;
		}
	}
}
  • 析构函数
UDG::~UDG()
{
	for (int i = 0; i < V_num; i++)
	{
		while (list[i].node.next!=NULL)
		{
			AdjNode* p = new AdjNode;
			p = list[i].node.next;
			list[i].node.next = p->next;
			delete p;
		}
	}
	delete[]list;
}
  • 广度优先搜索算法
bool UDG::bfs()
{
	for (int i = 0; i < V_num; i++)
		list[i].isvisted = false;
	int length = 0;
	int count = 0;
	for (int i = 0; i < V_num; i++)
	{
		if (!list[i].isvisted)
		{
			length += bfs(i + 1);
			count++;
		}
	}
	bool a = true;
	if (count != 1)
	{
		cout << "该图不连通" << endl;
		a = false;
	}
	if (length != V_num - 1)
	{
		cout << "该图不满足|V|=|E|+1" << endl;
		a = false;
	}
	return a;
}
int UDG::bfs(int i)
{
	queue<int> Queue;
	Queue.push(i);
	int length = 0;
	while (!Queue.empty())
	{
		int index = Queue.front();
		cout << list[index-1].node.data << " ";
		Queue.pop();
		list[index - 1].isvisted = true;
		AdjNode* p = list[index - 1].node.next;
		while (p != NULL)
		{
			if (!list[p->index - 1].isvisted)
			{
				Queue.push(p->index);
				length += p->num;
			}
			p = p->next;
		}
	}
	cout << endl;
	return length;
}
  • 深度优先搜索算法
bool UDG::dfs()
{
	for (int i = 0; i < V_num; i++)
		list[i].isvisted = false;
	int length = 0;
	int count = 0;
	for (int i = 0; i < V_num; i++)
	{
		if (!list[i].isvisted)
		{
			length += dfs(i);
			count++;
		}
	}
	cout << endl;
	bool a = true;
	if (count != 1)
	{
		cout << "该图不连通" << endl;
		a = false;
	}
	if (length != V_num - 1)
	{
		cout << "该图不满足|V|=|E|+1" << endl;
		a = false;
	}
	return a;
}

int UDG::dfs(int i)
{
	int length = 0;
	list[i].isvisted = true;
	cout << list[i].node.data << " ";
	AdjNode* p = new AdjNode;
	p = list[i].node.next;
	while (p != NULL)
	{
		if (!list[p->index - 1].isvisted)
		{
			length += p->num;
			length+=dfs(p->index - 1);
		}
		p = p->next;
	}
	return length;
}
  • 主函数
int main()
{
	UDG graph;
	cout << "通过广度优先搜索算法判断:" << endl;
	if (graph.bfs()) cout << "该图是树" << endl;
	else cout << "该图不是树" << endl;
	cout << endl << endl << endl;
	cout << "通过深度优先搜索算法判断:" << endl;
	if (graph.dfs()) cout << "该图是树" << endl;
	else cout << "该图不是树" << endl;
	return 0;
}
  • 全部代码
#include<iostream>
#include<queue>
using namespace std;

struct AdjNode
{
	char data;
	int index;
	int num;
	AdjNode* next;
};

struct AdjList
{
	AdjNode node;
	bool isvisted;
};

class UDG
{
public:
	UDG();
	~UDG();
	bool bfs();
	bool dfs();
protected:
	int bfs(int i);
	int dfs(int i);
private:
	struct AdjList* list;
	int V_num;
};

UDG::UDG()
{
	cout << "请输入所有顶点数:";
	cin >> V_num;
	list = new AdjList[V_num];
	cout << "请依次输入每个顶点的名称:" << endl;
	for (int i = 0; i < V_num; i++)
	{
		cin >> list[i].node.data;
		list[i].node.index = i + 1;
		list[i].node.next = NULL;
	}
	for (int i = 0; i < V_num; i++)
	{
		int size;
		cout << "请输入第" << i + 1 << "个顶点的邻接点数量:";
		cin >> size;
		for (int j = 1; j <= size; j++)
		{
			int index, E_num;
			cout << "请依次输入第"<<j<<"个邻接点的编号,到达该邻接点的边数:";
			cin >> index >> E_num;
			AdjNode* p = new AdjNode;
			p->index = index;
			p->num = E_num;
			p->next = list[i].node.next;
			list[i].node.next = p;
		}
	}
}

UDG::~UDG()
{
	for (int i = 0; i < V_num; i++)
	{
		while (list[i].node.next!=NULL)
		{
			AdjNode* p = new AdjNode;
			p = list[i].node.next;
			list[i].node.next = p->next;
			delete p;
		}
	}
	delete[]list;
}

bool UDG::bfs()
{
	for (int i = 0; i < V_num; i++)
		list[i].isvisted = false;
	int length = 0;
	int count = 0;
	for (int i = 0; i < V_num; i++)
	{
		if (!list[i].isvisted)
		{
			length += bfs(i + 1);
			count++;
		}
	}
	bool a = true;
	if (count != 1)
	{
		cout << "该图不连通" << endl;
		a = false;
	}
	if (length != V_num - 1)
	{
		cout << "该图不满足|V|=|E|+1" << endl;
		a = false;
	}
	return a;
}
int UDG::bfs(int i)
{
	queue<int> Queue;
	Queue.push(i);
	int length = 0;
	while (!Queue.empty())
	{
		int index = Queue.front();
		cout << list[index-1].node.data << " ";
		Queue.pop();
		list[index - 1].isvisted = true;
		AdjNode* p = list[index - 1].node.next;
		while (p != NULL)
		{
			if (!list[p->index - 1].isvisted)
			{
				Queue.push(p->index);
				length += p->num;
			}
			p = p->next;
		}
	}
	cout << endl;
	return length;
}

bool UDG::dfs()
{
	for (int i = 0; i < V_num; i++)
		list[i].isvisted = false;
	int length = 0;
	int count = 0;
	for (int i = 0; i < V_num; i++)
	{
		if (!list[i].isvisted)
		{
			length += dfs(i);
			count++;
		}
	}
	cout << endl;
	bool a = true;
	if (count != 1)
	{
		cout << "该图不连通" << endl;
		a = false;
	}
	if (length != V_num - 1)
	{
		cout << "该图不满足|V|=|E|+1" << endl;
		a = false;
	}
	return a;
}

int UDG::dfs(int i)
{
	int length = 0;
	list[i].isvisted = true;
	cout << list[i].node.data << " ";
	AdjNode* p = new AdjNode;
	p = list[i].node.next;
	while (p != NULL)
	{
		if (!list[p->index - 1].isvisted)
		{
			length += p->num;
			length+=dfs(p->index - 1);
		}
		p = p->next;
	}
	return length;
}
int main()
{
	UDG graph;
	cout << "通过广度优先搜索算法判断:" << endl;
	if (graph.bfs()) cout << "该图是树" << endl;
	else cout << "该图不是树" << endl;
	cout << endl << endl << endl;
	cout << "通过深度优先搜索算法判断:" << endl;
	if (graph.dfs()) cout << "该图是树" << endl;
	else cout << "该图不是树" << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/RealCoder/article/details/106532631