广度优先搜索和深度优先搜索

深度优先搜索

#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxValue 65535
#define SIZE 20
typedef struct
{
	char Vertex[SIZE];
	int IsTrave[SIZE];
	int  EdgeNum;
	int  VertexNum;
	int arcs[SIZE][SIZE];
}GraphMatrix; 
GraphMatrix *CreateGraph( )
{
	GraphMatrix *GM;
	char start,end;
	int weight;
	int head,tail;
    if((GM=(GraphMatrix *)malloc(sizeof(GraphMatrix)))==NULL)
	{
		cout<<"内存分配失败"<<endl;
		exit(1); 
	} 
	cout<<"请输入有多少个顶点和边长"<<endl;
	cin>>GM->VertexNum>>GM->EdgeNum;
	for(int i=0;i<GM->VertexNum;i++)
	{
		for(int j=0;j<GM->VertexNum;j++)
	     GM->arcs[i][j]=MaxValue;	
	} 
	for(int i=0;i<GM->VertexNum;i++)
	{
		GM->IsTrave[i]=0;//为被遍历 
	}
	cout<<"请输入各顶点的信息"<<endl; 
	for(int i=0;i<GM->VertexNum;i++)
	{
		cin>>GM->Vertex[i];
	} 
	cout<<"请输入各边的顶点和权值"<<endl; 
	for(int i=0;i<GM->EdgeNum;i++)
	{
		cin>>start>>end>>weight;
		for(head=0;start!=GM->Vertex[head];head++);
		for(tail=0;end!=GM->Vertex[tail];tail++);
		GM->arcs[head][tail]=weight; 
	}
	return GM;
}
void DeepTraOne(GraphMatrix *GM,int n)//使用系统的递归代替栈的作用 
{
	int i;
	GM->IsTrave[n]=1;
	printf("->%c",GM->Vertex[n]);
	for(i=0;i<GM->VertexNum;i++)
	{
	  	if((GM->arcs[n][i]!=MaxValue) && (GM->IsTrave[i]==0))//有边且没被访问过 
		{ 
			DeepTraOne(GM,i);
		}  
	}
	return; 
}
void DeepTraGraph(GraphMatrix *GM)
{
	printf("深度优先遍历结点\n");
	for(int i=0;i<GM->VertexNum;i++)
	{     
	  if(GM->IsTrave[i]==0)
	  {
	  		DeepTraOne(GM,i);
	  } 
	  
	} 
	printf("\n");
}
int main()
{
	GraphMatrix *GM;
	GM=CreateGraph(); 
	DeepTraGraph(GM);
	return 0;
}

广度优先搜索

#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxValue 65535
#define SIZE 20
typedef struct Data
{
	int  info;
}DATA;
typedef struct queue
{
	DATA queues[SIZE];
	int rear;//队尾 
	int front;//队头 
}Queue;
typedef struct
{
	char Vertex[SIZE];//顶点信息 
	int IsTrave[SIZE];//点是否被遍历 
	int EdgeNum;//边数 
	int VertexNum;//顶点数 
	int arcs[SIZE][SIZE];//权值 
}GraphMatrix;
Queue* InitQueue()//初始化队列 
{
	Queue* p;
	if ((p = (Queue*)malloc(sizeof(Queue))) == NULL)
	{
		cout << "分配内存失败" << endl;
		exit(1);
	}
	p->rear = 0;
	p->front = 0;
	return p;
}
void InQueue(Queue* p, int information)//入队(我们要考虑的是否队列已满) 
{
	if (p->rear == SIZE)
	{
		cout << "队列已满" << endl;
	}
	else
	{
		p->queues[p->rear++].info = information;//希望各位客官能够明白(理解)p->rear++的作用
		//改代码先执行p->queues[p->rear]=information 然后执行p->rear加1 
	}
}
int OutQueue(Queue* p)//出队(我们要考虑的是否队列为空) 
{
	if (p->rear == p->front)
	{
		cout << "队列为空" << endl;
	}
	else
	{
		return p->queues[p->front++].info;
	}
}
GraphMatrix* CreateGraph() //构造图(邻接矩阵) 
{
	char end, start;
	int head, tail;
	int weight;
	GraphMatrix* GM;
	if ((GM = (GraphMatrix*)malloc(sizeof(GraphMatrix))) == NULL)
	{
		cout << "内存分配失败" << endl;
		exit(1);
	}
	printf("请输入有多少个顶点和边数\n");
	cin >> GM->VertexNum >> GM->EdgeNum;
	for (int i = 0; i < GM->VertexNum; i++)
	{
		GM->IsTrave[i] = 0;
		for (int j = 0; j < GM->VertexNum; j++)
		{
			GM->arcs[i][j] = MaxValue;
		}
	}
	printf("请输入各个顶点的信息\n");
	for (int i = 0; i < GM->VertexNum; i++)
	{
		cin >> GM->Vertex[i];
	}
	printf("请输入各边的顶点和权值\n");
	for (int k = 0; k < GM->EdgeNum; k++)
	{
		cin >> start >> end >> weight;
		for (head = 0; start != GM->Vertex[head]; head++);
		for (tail = 0; end != GM->Vertex[tail]; tail++);
		GM->arcs[head][tail] = weight;
	}
	return GM;
}
void BFSOne(GraphMatrix* GM, Queue* p, int n)
{
	int start;
	InQueue(p, n);//广度优先搜索需要的时队列 先入队 
	GM->IsTrave[n] = 1;
	while (p->front != p->rear)
	{
		start = OutQueue(p);
		cout << GM->Vertex[start] << "  ";
		for (int i = 0; i < GM->VertexNum; i++)
		{
			if (GM->arcs[start][i] != MaxValue && GM->IsTrave[i] == 0)//有边且没被访问 
			{
				InQueue(p, i);//这些点被访问 储存起来 
				GM->IsTrave[i] = 1;
			}
		}
		cout<<endl;
	}
}
void BFSTraGraph(GraphMatrix *GM,Queue *p)//防止它不是连通图 
{
	int i;
	cout<<"广度优先遍历结点"<<endl; 
	for(int i=0;i<GM->VertexNum;i++)
	{
	   if(GM->IsTrave[i]==0)
	   {
	   	 BFSOne(GM,p,i);
	   }
	}
}
int main()
{
	Queue* p;
	GraphMatrix* GM;
	GM =CreateGraph();
	p=InitQueue();
   BFSTraGraph(GM,p);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值