图的分支生成:对稀疏的无向图,在度数不等于2的节点处,将图“拆散”,输出各条分支,分别用深度优先搜索和广度优先搜索实现。
图各顶点构造如下:
1.使用C++代码实现BFS如下:
#include<iostream>
#define MAX_VERTEX_NUM 20
using namespace std;
typedef char VertexType;
//我们用邻接表来作图的存储结构
//表结点类型
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
//int info;
}ArcNode;
//邻接表结点
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
//图节点
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
//链队结点的类型
typedef struct Qnode{
int data;
struct Qnode *next;
}Qnode,*QueuePtr;
//链队指针类型
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int visited[MAX_VERTEX_NUM];
//查找顶点对应的下标值
int LocateVex(ALGraph G,char u)
{
int i;
for (i=0;i<G.vexnum;i++)
{
if(u==G.vertices[i].data)
return i;
}
if (i==G.vexnum)
{
cout<<"error!"<<endl;
exit(1);
}
return 0;
}
//初始化队列
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));
if(!Q.front)
exit(1); //存储分配失败
Q.front->next=NULL;
}
//进队
void EnQueue(LinkQueue &Q,int e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(Qnode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
//判断是否为空
int QueueEmpty(LinkQueue &Q)
{
return (Q.front==Q.rear? 1:0);
}
//删除队列元素
void DeQueue(LinkQueue &Q,int &e)
{
QueuePtr p;
if(QueueEmpty(Q))
{
cout<<"\n Queue is free!";
exit(1);
}
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.front->next==NULL)
Q.rear=Q.front;
free(p);
}
void CreateALGraph_adjlist(ALGraph &G)
{
int i,j,k;
char v1,v2;
ArcNode *p;//临接表节点
cout<<"Input 顶点数& 边数:\n";//输入顶点和边数
cin>>G.vexnum;
cin>>G.arcnum;
cout<<"Input 各顶点(以空格隔开各个数据):\n";
for (i=0;i<G.vexnum;i++)
{
cin>>G.vertices[i].data;//注意点,解说
G.vertices[i].firstarc=NULL;
}
//"r","s","t","u","v","w","x","y"
//{0,1},{0,4},{1,5},{2,3},{2,5},{2,6},{3,6},{3,7},{5,6},{6,7}
cout<<"Input 边(v1,v2)以回车分开各个数据:\n";
for (k=0;k<G.arcnum;k++)//建立邻接表
{
cin>>v1;
cin>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G.vertices[i].firstarc; //前插法,即每次都插入到头结点的后面
G.vertices[i].firstarc=p;
cout<<"Next:\n";
}
}
void BFSTraverse(ALGraph &G,int u)
{
LinkQueue Q;
for(int v=0;v<G.vexnum;++v) //之所有节点都未访问
visited[v]=false;
InitQueue(Q);//初始化队列
cout<<"广度遍历结果"<<endl;
for(int v=u,i=0;i<G.vexnum;v=(v+1+G.vexnum)%G.vexnum)
if(!visited[v])//未被访问的
{
EnQueue(Q,v);//未被访问的进队
while(!QueueEmpty(Q))//队列非空
{
int u;
DeQueue(Q,u);//u=队列最早进队的元素
visited[u]=true;//将u置为已被访问
cout<<G.vertices[u].data<<" ";//visit一下,输出节点元素
for(ArcNode *w=G.vertices[u].firstarc;w;w=w->nextarc)//访问节点的邻接表
if(!visited[w->adjvex])//当邻居吧中的元素未被访问时,入队
EnQueue(Q,w->adjvex);
}
}
cout<<endl;
}
int BFS_selected(ALGraph &G)//寻找图中节点度不为的顶点
{
for(int v=0;v<G.vexnum;++v)
{
for(ArcNode *w=G.vertices[v].firstarc;w;w=w->nextarc)//访问节点的邻接表
{
int i=0;
ArcNode *ww=w;
while(ww)
{
i++;
ww=ww->nextarc;
}
if(i==3)//度数为的顶点
{
return i;
break;
}
else
{
continue;
}
}
}
}
int main()
{
ALGraph G;
CreateALGraph_adjlist(G);
cout<<endl;
int u=BFS_selected(G);
BFSTraverse(G,u);
system("pause");
}
2.使用C++代码实现DFS如下:
#define MAX_VERTEX_NUM 10
#include<iostream>
using namespace std;
typedef char VertexType;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
int info;
}ArcNode; //表结点类型
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点
typedef struct{
AdjList vertices; //邻接表
int vexnum,arcnum;
}ALGraph;
int visited[MAX_VERTEX_NUM];
//定位u
int LocateVex(ALGraph G,char u)
{
int i;
for (i=0;i<G.vexnum;i++)
{
if(u==G.vertices[i].data)
return i;
}
if (i==G.vexnum)
{
cout<<"Error u!\n";
exit(1);
}
return 0;
}
//建立图的邻接表
void CreateALGraph_adjlist(ALGraph &G)
{
int i,j,k;
char v1,v2;
ArcNode *p;
//输入顶点个数和边数
cout<<"Input vexnum & arcnum:\n";
cin>>G.vexnum;//顶点
cin>>G.arcnum;//边
cout<<"Input Vertices:\n";//输入各顶点
for (i=0;i<G.vexnum;i++)
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"Input 各边(v1,v2)以回车分开各个数据:\n";
//"r","s","t","u","v","w","x","y"
// //{0,1},{0,4},{1,5},{2,3},{2,5},{2,6},{3,6},{3,7},{5,6},{6,7}
for (k=0;k<G.arcnum;k++)//建立个顶点对应的邻接表
{
cin>>v1;
cin>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
//p->info = w;//带权值的图
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
cout<<"NEXT:"<<endl;
}
}
//从第v个顶点出发DFS
void DFS(ALGraph &G, int v)
{
ArcNode *p;
cout<<G.vertices[v].data<<" ";
visited[v]=1;//输出节点,并将节点置为已访问
p=G.vertices[v].firstarc;
while(p)//p不为空时
{
if (!visited[p->adjvex])//递归遍历所有未被访问的邻接点
DFS(G,p->adjvex);
p=p->nextarc;
}
}
int DFS_selected(ALGraph &G)//寻找图中节点度不为2的顶点
{
for(int v=0;v<G.vexnum;++v)
{
for(ArcNode *w=G.vertices[v].firstarc;w;w=w->nextarc)//访问节点的邻接表
{
int i=0;
ArcNode *ww=w;
while(ww)
{
i++;
ww=ww->nextarc;
}
if(i==3)//度数为3的顶点
{
return i;
break;
}
else
{
continue;
}
}
}
}
void DFSTraverse(ALGraph &G)
{
for (int v=0;v<G.vexnum;++v)
visited[v]=0;
cout<<"深度遍历结果:"<<endl;
//(int v=u,i=0;i<G.vexnum;v=(v+1+G.vexnum)%G.vexnum)
int u=DFS_selected(G);
for (int v=u,i=0;i<G.vexnum;v=(v+1+G.vexnum)%G.vexnum)
if (!visited[v])
DFS(G,v);
cout<<endl;
}
int main()
{
ALGraph G;//建图
CreateALGraph_adjlist(G);
DFSTraverse(G);//深度优先遍历
system("pause");
}
DFS:
#define MAX_VERTEX_NUM 10
#include<iostream>
using namespace std;
typedef char VertexType;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
int info;
}ArcNode; //表结点类型
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点
typedef struct{
AdjList vertices; //邻接表
int vexnum,arcnum;
}ALGraph;
int visited[MAX_VERTEX_NUM];
//定位u
int LocateVex(ALGraph G,char u)
{
int i;
for (i=0;i<G.vexnum;i++)
{
if(u==G.vertices[i].data)
return i;
}
if (i==G.vexnum)
{
cout<<"Error u!\n";
exit(1);
}
return 0;
}
//建立图的邻接表
void CreateALGraph_adjlist(ALGraph &G)
{
int i,j,k;
char v1,v2;
ArcNode *p;
//输入顶点个数和边数
cout<<"Input vexnum & arcnum:\n";
cin>>G.vexnum;//顶点
cin>>G.arcnum;//边
cout<<"Input Vertices:\n";//输入各顶点
for (i=0;i<G.vexnum;i++)
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"Input 各边(v1,v2)以回车分开各个数据:\n";
//"r","s","t","u","v","w","x","y"
////{0,1},{0,4},{1,5},{2,3},{2,5},{2,6},{3,6},{3,7},{5,6},{6,7}
for (k=0;k<G.arcnum;k++)//建立个顶点对应的邻接表
{
cin>>v1;
cin>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
//p->info = w;//带权值的图
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
cout<<"NEXT:"<<endl;
}
}
//从第v个顶点出发DFS
void DFS(ALGraph &G, int v)
{
ArcNode *p;
cout<<G.vertices[v].data<<" ";
visited[v]=1;//输出节点,并将节点置为已访问
p=G.vertices[v].firstarc;
while(p)//p不为空时
{
if (!visited[p->adjvex])//递归遍历所有未被访问的邻接点
DFS(G,p->adjvex);
p=p->nextarc;
}
}
int BFS_selected(ALGraph &G)//寻找图中节点度不为的顶点
{
for(int v=0;v<G.vexnum;++v)
{
for(ArcNode *w=G.vertices[v].firstarc;w;w=w->nextarc)//访问节点的邻接表
{
int i=0;
ArcNode *ww=w;
while(ww)
{
i++;
ww=ww->nextarc;
}
if(i==3)//度数为的顶点
{
return i;
break;
}
else
{
continue;
}
}
}
}
void DFSTraverse(ALGraph &G)
{
for (int v=0;v<G.vexnum;++v)
visited[v]=0;
cout<<"深度遍历结果:"<<endl;
//(int v=u,i=0;i<G.vexnum;v=(v+1+G.vexnum)%G.vexnum)
int u=BFS_selected(G);
for (int v=u,i=0;i<G.vexnum;v=(v+1+G.vexnum)%G.vexnum)
if (!visited[v])
DFS(G,v);
cout<<endl;
}
int main()
{
ALGraph G;//建图
CreateALGraph_adjlist(G);
DFSTraverse(G);//深度优先遍历
system("pause");
}
图的分支生成:对稀疏的无向图,在度数不等于2的节点处,将图“拆散”,输出各条分支,分别用深度优先搜索和广度优先搜索实现。相关推荐
- 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索
什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...
- 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)
目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...
- 每天进步一点点【图的深度优先搜索与广度优先搜索】
图是一种数据结构,其中节点可以具有零个或多个相邻元素.两个节点之间的连接称为边.节点也可以称为顶点. 图分为三种:无向图.有向图.带权图 图的表示方式有两种:二维数组表示(邻接矩阵):链表表示(邻接表 ...
- 图的深度优先搜索和广度优先搜索(邻接表) - Java实现
文章目录 前言 1.什么是图? 2.图如何表示? 3.如何创建一个邻接表 一.深度优先搜索(Depth First Search) 二.广度优先搜索(Breadth First Search) 三.寻 ...
- 图的深度优先搜索和广度优先搜索
一.深度优先搜索(DFS) 每次都在访问完当前节点后首先访问当前节点的第一个邻接节点,可以看出这是一个递归的过程. 深度优先遍历算法步骤: 1.访问初始尾结点v,并标记结点v已经访问 2.查找结点v的 ...
- 生成图-深度优先搜索/宽度优先搜索
问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...
- 【图】图的深度搜索和广度搜索
深度优先搜索 图的深度优先遍历(Depth First Search,DFS)是一种遍历图的算法,其基本思想是从起始顶点开始,不断访问邻接顶点,直到无法继续访问为止,然后回溯到之前的顶点,继续访问其未 ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...
- 图的遍历——深度优先遍历与广度优先遍历
目录 何谓遍历? 图的遍历特点 图的遍历方式 深度优先搜索 过程分析 案例分析: 算法的代码实现 测试案例: 测试结果如下: 遍历非连通图 算法复杂度分析 额外补充 广度优先搜索 过程分析 辅助队列 ...
- 图的广度优先搜索遍历
广度优先搜索遍历 广度优先搜索遍历类似与树的层次遍历,过程如下: (1) 从图中的某个顶点v出发,访问v (2) 依次访问v的各个未曾访问的邻接点 (3) 分别从这些邻接点出发依次访问他们的邻接点,并 ...
最新文章
- mysql mysqld_multi 单机多进程
- 基于matlab_simulink的捷联惯性导航系统仿真,基于MATLAB/Simulink的捷联惯性导航系统仿真...
- linux 负数_linux内核提权系列教程(2):任意地址读写到提权的4种方法
- 免费的简单化图标集 - 296个12x12的PNG格式图标
- 架构师给程序员的一封信
- 逆天的IE7中,诡异的横向滚动条
- 三和韓長庚 著 易學原理總論 對讀 021_040
- A.457 - Linear Cellular Automata
- SAP常用TCODE
- Msm8937+android7.1.1编译环境搭建及编译
- 使用福昕PDF编辑器裁剪PDF页面
- html代码标签优化与提速,HTML代码标签优化与提速
- 微信小程序web-view与H5 通信方式探索
- JavaScript # 前端 js、html中的单引号、双引号及其转义使用
- Linux中vmstat命令详解
- 云计算现在前景如何?
- MRM_TOLERANCE_CHECK 增强点:MM08R002 标准逻辑 补充_SAP刘梦_新浪博客
- 计算机组成原理学习笔记第5章指令系统 5.6——MIPS指令详解
- 开课吧 算法工程师高级深度学习 视频
- Android 换肤解决方案