//严蔚敏《数据结构》
//图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)
//昨天的DFS、BFS并只考虑了连通图,并没有考虑非连通图
//经过书中的DFS的DFSTraverse()与DFS()的关系,顺势推出BFSTraverse()与BFS()
//自学中,加油!
#include<iostream>
#include<string>
using namespace std;
#define InfoType double
#define VertexType string
const int MaxVertexNum=20;
typedef struct Edge
{
int ivex;
InfoType* info;
struct Edge* nextedge;
}Edge;//边的邻接点信息
typedef struct VNode
{
VertexType data;
Edge* firstage;
}VNode;//顶点结点
typedef struct
{
VNode Vlist[MaxVertexNum];
int vexnum,edgnum;
int* visited;
}ALGraph;//用邻接表表示图
int Locate_Vlist(ALGraph G,VertexType v)
{
for(int i=0;i!=G.vexnum;i++){
if(G.Vlist[i].data==v)
return i;
}
cout<<"未找到\n";
return -1;
}
bool Creat_UDNGraph(ALGraph& G)//创建无向网的邻接表 bug1:ALGraph G//你这nb啊,心态有点小炸
{
cout<<"输入无向网的顶点数和边数:";
cin>>G.vexnum>>G.edgnum;
G.visited=new int[G.vexnum];
cout<<"输入顶点信息(类型为string)\n";
for(int i=0;i!=G.vexnum;i++){
cin>>G.Vlist[i].data;
G.Vlist[i].firstage=nullptr;
}
VertexType v1,v2;
InfoType w;
int i,j;
Edge* p1,* p2;
for(int k=0;k!=G.edgnum;k++){
cout<<"输入两个顶点信息和权值:";
cin>>v1>>v2>>w;
i=Locate_Vlist(G,v1);
j=Locate_Vlist(G,v2);
p1=new Edge;
if(!p1)
return false;
p1->ivex=j;
p1->info=new InfoType;
*p1->info=w;
p1->nextedge=G.Vlist[i].firstage;G.Vlist[i].firstage=p1;
p2=new Edge;
if(!p2)
return false;
p2->ivex=i;
p2->info=new InfoType;
*p2->info=w;
p2->nextedge=G.Vlist[j].firstage;G.Vlist[j].firstage=p2;
}
return true;
}
void Output_UDN(ALGraph G)//输出无向图的邻接表
{
Edge* p;
for(int i=0;i!=G.vexnum;i++){
cout<<"顶点:"<<G.Vlist[i].data;
p=G.Vlist[i].firstage;
while(p){
cout<<"->邻接点在数组的位置下标:"<<p->ivex<<"邻接点信息:"<<G.Vlist[p->ivex].data;
if(p->info)
cout<<"权值:"<<*p->info;
p=p->nextedge;
}
cout<<endl;
}
}
void DFS(ALGraph G,int i)//从Vlist数组中位置下标为i的顶点开始,深度遍历图的单个连通分量
{
cout<<"信息:"<<G.Vlist[i].data<<endl;
G.visited[i]=1;//遍历过将visited改为1
Edge* p=G.Vlist[i].firstage;
while(p){
if(!G.visited[p->ivex])//若
DFS(G,p->ivex);
p=p->nextedge;
}
}
void DFSTraverse(ALGraph& G)//深度遍历图的全部连通分量
{
for(int i=0;i!=G.vexnum;i++){//将visited置为0,表示未被遍历过
G.visited[i]=0;
}
for(int i=0;i!=G.vexnum;i++){
if(!G.visited[i])
DFS(G,i);
}
}
//构建的队列为图的广度优先遍历服务
#define QElemType int//队列存储边的位置下标
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode,* Qlink;
typedef struct
{
Qlink head,tail;
int len;
}LinkQueue;
bool Init_Queue(LinkQueue& Q)//初始化队列
{
Q.head=new QNode;
if(!Q.head)
return false;
Q.head->next=nullptr;
Q.tail=Q.head;
Q.len=0;
return true;
}
bool IsEmpty(LinkQueue Q)//判断队列是否为空
{
if(Q.len==0)
return true;
return false;
}
bool EnQueue(LinkQueue& Q,QElemType e)//入队
{
Qlink p=new QNode;
p=new QNode;
if(!p)
return false;
p->data=e;
p->next=Q.tail->next;
Q.tail->next=p;
Q.tail=p;
Q.len++;
return true;
}
bool DeQueue(LinkQueue& Q,QElemType& e)//出队
{
if(Q.len==0)
return false;
Qlink p=Q.head->nex
2020-10-11 //严蔚敏《数据结构》 //图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)
本文探讨了数据结构中的图遍历方法,重点介绍了深度优先搜索(DFS)和广度优先搜索(BFS)的基本概念与实现。通过对具体图例的测试,阐述了这两种算法在解决图问题时的不同策略和适用场景。
摘要由CSDN通过智能技术生成