问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

图的邻接表的深度优先搜索

发布网友 发布时间:2022-04-21 21:57

我来回答

1个回答

热心网友 时间:2023-09-11 08:54

#include "iostream.h"
int *visited; //存放当前结点是否遍历

typedef int **MGraph;//定义一个二维数组存放邻接矩阵,暂不定义矩阵大小,数据元素类型为整型
//把矩阵看作数组元素是一维数组的一个一维数组

struct ArcNode{ //定义邻接表中的边结点类型
int adjvex; //邻接点位置
int weight; //权值
ArcNode *nextarc; //指向下一个边结点的链域
};
struct VNode{
int data;
ArcNode *nextarc;
};//邻接表表头结点
typedef VNode *adjlist;

//邻接矩阵存储方式
void InitGraph(MGraph &G,int n) //建立n行n列的二维数组
{
G=new int *[n];//分配第一维空间
int i,j;
for(i=0;i<n;i++)
G[i]=new int[n];//分配第二维空间
for(i=0;i<n;i++)
for(j=0;j<n;j++)
G[i][j]=0;//初始情况下没有连接
}

void CreateGraph(MGraph &G,int n){//建立无向图,其它形式的图可以自己建立
int i,j,e;
cout<<"输入无向图中边的总数量";
cin>>e;
cout<<"\n输入每条边的起点和终点序号(注:结点编号范围为0~n-1):\n";
for(int k=1;k<=e;k++){
cout<<"\n第"<<k<<"对边:";
cin>>i>>j;
if(i>n||j>n||i<0||j<0) return;
G[i][j]=G[j][i]=1;}
}

void dfsMGraph(MGraph G,int n,int i)//从第i个顶点开始遍历
{
cout<<i<<"==>";
visited[i]=1;
for(int j=0;j<n;j++)
if(G[i][j]!=0&&!visited[j])
dfsMGraph(G,n,j);
}

void bfsMGraph(MGraph G,int n,int i)//从第i个顶点开始遍历
{
int *q=new int[n];
int front=0,rear=0; //定义一个队列存放当前已被访问,但其邻接点未被访问的结点
cout<<i<<"==>";
visited[i]=1;
q[rear]=i;
rear=(rear+1)%n;//用的是循环队列
while(front!=rear)
{
int k=q[front];
front=(front+1)%n;
for(int j=0;j<n;j++)
{
if(G[k][j]!=0&&!visited[j])
{
cout<<j<<"==>";
visited[j]=true;
q[rear]=j;
rear=(rear+1)%n;
}//end if
}//end for
}// end while
}

//邻接表存储方式

//初始化
void InitAdj(adjlist &G,int n)
{
G=new VNode[n];
for(int i=0;i<n;i++) {G[i].data=i;G[i].nextarc=NULL;}
}

//建立邻接表存储方式的图
void CreateAdj(adjlist &G,int n)
{
int i,j,k,e;
cout<<"输入图的总边数:";
cin>>e;
cout<<"\n输入每条边的起点和终点序号(注:结点编号范围为0~n-1):\n";
for(k=1;k<=e;k++){
cout<<"\n第"<<k<<"对边:";
cin>>i>>j;
if(i>n||j>n||i<0||j<0) return;
//向序号为i的链表中插入一个边结点
ArcNode*p=new ArcNode;
p->adjvex=j;p->weight=1;
p->nextarc=G[i].nextarc;
G[i].nextarc=p;
//向序号为j的链表中插入一个边结点
p=new ArcNode;
p->adjvex=i;p->weight=1;
p->nextarc=G[j].nextarc;
G[j].nextarc=p;
}
}
//深度遍历邻接表
void dfsAdj(adjlist G,int n,int i)
{
cout<<i<<"==>";
visited[i]=true;
ArcNode *p=G[i].nextarc;
while(p!=NULL)
{
int j=p->adjvex;
if(!visited[j])
dfsAdj(G,n,j);
p=p->nextarc;
}
}

//广度遍历邻接表
void bfsAdj(adjlist G,int n,int i)
{
int *q=new int[n];
int front=0,rear=0; //定义一个队列存放当前已被访问,但其邻接点未被访问的结点
cout<<i<<"==>";
visited[i]=1;
q[rear]=i;
rear=(rear+1)%n;//用的是循环队列
while(front!=rear)
{
int k=q[front];
front=(front+1)%n;
ArcNode *p=G[k].nextarc;
//cout<<"p->adjvex"<<p->adjvex<<endl;
while(p)
{
int j=p->adjvex;
// cout<<"j="<<j<<endl;
if(!visited[j])
{
cout<<j<<"==>";
visited[j]=true;
q[rear]=j;
rear=(rear+1)%n;
}
p=p->nextarc;
}
}// end while
}
//根据邻接矩阵得到图的邻接表
void graphChange(MGraph gm,adjlist ga,int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(gm[i][j]!=0)
{
ArcNode *p=new ArcNode;
p->adjvex=j;
p->weight=gm[i][j];
p->nextarc=ga[i].nextarc;
ga[i].nextarc=p;
}
}
//主函数
void main()
{
int i,n,v;MGraph gm;
cout<<"输入图中顶点数量:";
cin>>n;
visited=new int[n];
cout<<"按图的邻接矩阵方式建立图\n";
InitGraph(gm,n);
CreateGraph(gm,n);
//按图的邻接矩阵得到的深度优先遍历
cout<<"输入按图的邻接矩阵遍历的起始顶点:";
cin>>v;
cout<<"按图的邻接矩阵得到的深度优先遍历:"<<endl;
for(i=0;i<n;i++)
visited[i]=0;
cout<<"开始==>";
dfsMGraph(gm,n,v);
cout<<"结束\n";
//按图的邻接矩阵得到的度优先遍历
cout<<"按图的邻接矩阵得到的广度优先遍历:"<<endl;
for(i=0;i<n;i++)
visited[i]=0;
cout<<"开始==>";
bfsMGraph(gm,n,v);
cout<<"结束\n";

adjlist ga;
InitAdj(ga,n);
// cout<<"\n按图的邻接表方式建立图\n";
// CreateAdj(ga,n);

graphChange(gm,ga,n);
//按图的邻接表得到的深度优先遍历
cout<<"输入按图的邻接表遍历的起始顶点:";
cin>>v;
cout<<"按图的邻接表得到的深度优先遍历:"<<endl;
for(i=0;i<n;i++)
visited[i]=0;
cout<<"开始==>";
dfsAdj(ga,n,v);
cout<<"结束\n";
//按图的邻接表得到的度优先遍历
cout<<"按图的邻接表得到的广度优先遍历:"<<endl;
for(i=0;i<n;i++)
visited[i]=0;
cout<<"开始==>";
bfsAdj(ga,n,v);
cout<<"结束\n";
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 如果公司借壳上市,那原公司会停盘吗,如果一直持有那个公司的股票呢... 邻接表做深度优先遍历和广度优先遍历的代码 请问怎样根据邻接表表示恢复及图的的深度和广度优... 邻接矩阵、邻接表表示图时的深度优先序列、广度优... 请问,法学研究生能当兼职律师么? 你好,请问用邻接表存储无向图,进行深度优先搜索... 图采用邻接矩阵和邻接链表表示时,深度优先遍历算法... 如题,以邻接表存储图,并对图进行深度优先遍历 采用邻接表存储的图的深度优先遍历算法类似于二叉... 那里有教清洗空调的吗 数据结构,请问图的邻接表表示时进行深度优先搜索... 小米miui10价格是多少 她突然接到一个任务要去呵护书中的反派是什么小说? 在用邻接表表示图时,对图进行深度优先搜索遍历的算... 快穿女主高冷强大反派角色,不理男主的小说 用邻接表表示图进行深度优先遍历时,通常采用()... 怎样为小米手机安装MIUI系统? 求一本快穿,除了女主还有一位快穿者,是个男的,... 求好看的快穿文,女强,不怕系统什么的,很厉害的... 求女配修仙、师徒、完结文! 快穿系统文第一世女主是男主师父女主是什么峰的峰... c语言(求改错):用邻接表创建图并实现深度优先遍... 求推荐空调清洗方法 画出如下图的邻接表,并分别给出从结点1开始进行深... 已知某图邻接表储存结构,如何画出深度优先生成树? 基于邻接表的遍历得到的深度优先序列不唯一 《数据结构》以邻接表位存储,写出连通图的深度优... 为什么我的手机号不能申请QQ号码,总是提示验证行... 编程实现以邻接表或邻接矩阵为存储结构,图的广度... 我的手机为什么注册不了QQ 图的矩阵深度和广度遍历算法 注册不了QQ,说我由于检测到你的手机号码注册行为... 为什么我的手机号注册不了qq? 怎么把excel表里照片删除 excel删除所有图片 为什么我的手机号不能再申请QQ号了 如何同时删除多个excel表中的图片? 为什么我的手机现在注册不了新QQ号 我这个是PDF转word文件,修改文字的时候全部显示这... Excel小技巧二、将所有图片删除 为什么我的手机号注册不了QQ