DFS算法,BFS算法遍历图

前提:所有图的实现我都只用了邻接矩阵进行图的存储

DFS算法遍历图

//图的遍历之深度优先搜索
#include<iostream>
#define MAX 1000
#define TRUE 1
#define ERROR 0
using namespace std;

class Graph
{
private:
	int n;  //结点个数的平方
	int m;  //节点的个数
	int *graph;
	int *visited;
public:
	Graph(int n1)
	{
		n=n1*n1;
		m=n1;
		graph=new int [n];
		visited=new int [n1];
	}
	void Set_Data()
	{
		//memset(visited,0,sizeof(visited));//指针开辟的数组不能用这个函数初始化,只能对静态的数组初始化
		cout<<"请输入图的关系矩阵,不可达或自身到自身的则为0,能到达的两点为1,请按这种方式输入关系矩阵:"<<endl;
		int i,j;
		for(i=0;i<m;i++)
			for(j=0;j<m;j++)
				cin>>graph[i*m+j];
		for(i=0;i<m;i++)
			visited[i]=0;
	}
	int dfs(int v,int s)
	{
		int w=0;
		s++;
		Output(v,s);
		visited[v]=1;
		for(;w<m;w++)
			if(!visited[w]&&graph[v*m+w]==1)s=dfs(w,s);
			return s;
	}
	void Output(int v,int s)
	{
		if(s==m)cout<<v;
		else
		cout<<v<<"->";
	}
	void dfs_Graph()
	{
		int i,s=0;
		for(i=0;i<m;i++)
			if(!visited[i])s=dfs(i,s);
	}
};
int main()
{
	int n;
	cout<<"输入图的顶点数为:";
	cin>>n;
	Graph a(n);
	a.Set_Data();
	cout<<"深度优先搜索的序列为:";
	a.dfs_Graph();
	cout<<endl;
	return 0;
}


BFS算法遍历图(用队列实现,我用的是循环队列)

#include<iostream>
#define Length 10
#define ERROR 0
#define TRUE 1
using namespace std;

class XU_DL
{
private:
	int *item;
	int front;
	int rear;
	int maxlength;
public:
	XU_DL(int length=Length) //对队列的初始化
	{
		if(length<Length)length=Length;
		item=new int [length];
		maxlength=length;
		front=0;
		rear=0;
	}
	~XU_DL()  //析构函数销毁队列
	{
		delete [] item;
	}
	void ClearXU_DL()  //清空队列
	{
		front=rear=0;
	}
	int Getlength() //获得长度
	{
		if(rear==front) 	return ERROR;
		return ((rear-front)+maxlength)%maxlength;
	}
	int Inser(int e)  //插入数据e
	{
		if((rear+1)%maxlength==front)return ERROR;  //队满时的判断语句
		rear=(rear+1)%maxlength;
		item[rear]=e;
		return TRUE;
	}
	int Gethand()  //获得队头元素,并删除该数
	{
		int e;
		if(rear==front)return ERROR;  //队列为空事的判断语句
		e=item[(front+1)%maxlength];
		front++;
		return e;
	}
	int Deletedate(int e)  //获取数据并删除该数
	{
		if(rear==front)return ERROR; //队列为空
		front=(front+1)%maxlength;
		e=item[front];
		return TRUE;
	}
	void Output()
	{
		if(front==rear){cout<<"The queue is null!"<<endl;return;}
		cout<<"The queue length is :"<<Getlength()<<endl;
		cout<<"The queue's content is :";
		for(int i=1;i<Getlength();i++)
			cout<<item[i]<<"->";
		cout<<item[i]<<endl;
	}
	int Output1(int s,int m)
	{
		int temp;
		temp=Gethand();
		if(s==m)cout<<temp;
		else
			cout<<temp<<"->";
		return temp;
	}
};
class Graph:public XU_DL 
{
private:
	int n;  //结点个数的平方
	int m;  //节点的个数
	int *graph;
	int *visited;
public:
	Graph(int n1)
	{
		n=n1*n1;
		m=n1;
		graph=new int [n];
		visited=new int [n1];
	}
	void Set_Data()
	{
		//memset(visited,0,sizeof(visited));
		cout<<"请输入图的关系矩阵,不可达或自身到自身的则为0,能到达的两点为1,请按这种方式输入关系矩阵:"<<endl;
		int i,j;
		for(i=0;i<m;i++)
			for(j=0;j<m;j++)
				cin>>graph[i*m+j];
		for(i=0;i<m;i++)
			visited[i]=0;
	}
	void bfs(int v)   //把以某个点的所有相邻的点都包含进去了
	{
		int i;bool frag(false);
		ClearXU_DL();
		frag=true;
		while(frag)
		{
			Inser(v);
			visited[v]=1;
			for(i=v;i<m;i++)
				if((visited[i]==0)&&graph[v*m+i]==1){Inser(i);visited[i]=1;}
			for(i=0;i<m;i++)
			{
				if(visited[i]==1)frag=false;
				else
				{
					frag=true;
					v=i;
					break;
				}
			}
		}
		Output();
	}
	void bfs1(int v)  //front的值会改变
	{
		int i,j,s=0;
		bool frag(false);
		ClearXU_DL();
		frag=true;
		while(frag)
		{
			Inser(v);
			visited[v]=1;
			while(Getlength()!=0)
			{
				s++;
				i=Output1(s,m);
				for(j=0;j<m;j++)
					if((visited[j]==0)&&graph[i*m+j]==1)
					{
						Inser(j);
						visited[j]=1;
					}
			}
			for(i=0;i<m;i++)
			{
				if(visited[i]==1)frag=false;
				else
				{
					frag=true;
					v=i;
					break;
				}
			}
		}
		cout<<endl;
	}
};
int main()
{	int n;
	cout<<"输入图的顶点数为:";
	cin>>n;
	Graph a(n);
	a.Set_Data();
	cout<<"广度优先搜索的序列为:";
	a.bfs1(0);
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值