数据结构 邻接矩阵的BFS DFS
来源:互联网 发布:淘宝盗图技巧不被发现 编辑:程序博客网 时间:2024/05/20 16:34
#include <stdio.h>
#define MAXNODE 10
typedef struct
{
char vertexs[MAXNODE];//以为数组来存储顶点信息
int arc[MAXNODE][MAXNODE];//存储边
int vexnum,arcnum;
}GraphType;
typedef struct
{
int rear,front;
int data[MAXNODE];
}SepQueue;
void CreateGraphType(GraphType*);
int LocatedGraphType(GraphType*,char);
void DFSTraverse(GraphType*);
void DFS(GraphType*,int);
void BFSTraverse(GraphType*);//广度优先遍历
void BFS(GraphType*,int,SepQueue*);//我们用队列来进行遍历
int visited[MAXNODE];
int main(void)
{
GraphType G;
CreateGraphType(&G);
printf("dfs遍历为:\n");
DFSTraverse(&G);
printf("bfs遍历为:\n");
BFSTraverse(&G);
return 0;
}
int LocatedGraphType(GraphType*G,char v)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
if(v==G->vertexs[i])
{
k=i;
break;
}
return k;
}
void CreateGraphType(GraphType*G)
{
int i,j,k;
char a,b;
printf("请输入图的顶点数和边数:");
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arc[i][j]=0;//初始化
printf("请输入定点的信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vertexs[i]));//这里接受一下回车键。
printf("输入相应的点点:");
for(k=0;k<G->arcnum;k++)
{
scanf("%c,%c",&a,&b);
i=LocatedGraphType(G,a);
j=LocatedGraphType(G,b);
G->arc[i][j]=1;
G->arc[j][i]=1;
}
return ;
}
void DFSTraverse(GraphType*G)//非连通图的遍历
{
int i;
for(i=0;i<G->vexnum;i++)
visited[i]=0;//标记全没有被访问
for(i=0;i<G->vexnum;i++)
if(!visited[i])
DFS(G,i);
return ;
}
void DFS(GraphType*G,int v)//深度优先遍历。相当于先序遍历
{
int i;
printf("当前DFS遍历的顶点为:%c\n",G->vertexs[v]);//首先访问。
visited[v]=1;
for(i=0;i<G->vexnum;i++)
if(!visited[i]&&G->arc[v][i]==1)//该节点没有被访问过,而且是刚才访问节点的邻接点(比如我们访问的是无向图的时候,我们访问过[1,3],但是我们访问点点3,就不会访问[3,1],因为visited[1]=1)
DFS(G,i);//接着以该邻接顶点为顶点,递归。()
return ;
}
void BFSTraverse(GraphType*G)
{
int i;
SepQueue queue;
queue.front=queue.rear=0;//队列的初始化。
for(i=0;i<G->vexnum;i++)
visited[i]=0;
for(i=0;i<G->vexnum;i++)
if(!visited[i])
BFS(G,i,&queue);
return ;
}
void BFS(GraphType*G,int v,SepQueue*queue)//相当于层次遍历(先访问-》标记-》入队)
{
int j,k;
printf("当前BFS遍历的顶点为:%c\n",G->vertexs[v]);
visited[v]=1;
queue->data[queue->rear++]=v;
while(queue->rear!=queue->front)//直到队列为空
{
j=queue->data[queue->front++];//将队头元素出列
for(k=0;k<G->vexnum;k++)
if(!visited[k]&&G->arc[j][k]==1)//将该节点的所有顶点都入队。(相当于二叉树的层次遍历)
{
printf("当前BFS遍历的顶点为:%c\n",G->vertexs[k]);
visited[k]=1;
queue->data[queue->rear++]=k;
}
}
return;
}
#define MAXNODE 10
typedef struct
{
char vertexs[MAXNODE];//以为数组来存储顶点信息
int arc[MAXNODE][MAXNODE];//存储边
int vexnum,arcnum;
}GraphType;
typedef struct
{
int rear,front;
int data[MAXNODE];
}SepQueue;
void CreateGraphType(GraphType*);
int LocatedGraphType(GraphType*,char);
void DFSTraverse(GraphType*);
void DFS(GraphType*,int);
void BFSTraverse(GraphType*);//广度优先遍历
void BFS(GraphType*,int,SepQueue*);//我们用队列来进行遍历
int visited[MAXNODE];
int main(void)
{
GraphType G;
CreateGraphType(&G);
printf("dfs遍历为:\n");
DFSTraverse(&G);
printf("bfs遍历为:\n");
BFSTraverse(&G);
return 0;
}
int LocatedGraphType(GraphType*G,char v)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
if(v==G->vertexs[i])
{
k=i;
break;
}
return k;
}
void CreateGraphType(GraphType*G)
{
int i,j,k;
char a,b;
printf("请输入图的顶点数和边数:");
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arc[i][j]=0;//初始化
printf("请输入定点的信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vertexs[i]));//这里接受一下回车键。
printf("输入相应的点点:");
for(k=0;k<G->arcnum;k++)
{
scanf("%c,%c",&a,&b);
i=LocatedGraphType(G,a);
j=LocatedGraphType(G,b);
G->arc[i][j]=1;
G->arc[j][i]=1;
}
return ;
}
void DFSTraverse(GraphType*G)//非连通图的遍历
{
int i;
for(i=0;i<G->vexnum;i++)
visited[i]=0;//标记全没有被访问
for(i=0;i<G->vexnum;i++)
if(!visited[i])
DFS(G,i);
return ;
}
void DFS(GraphType*G,int v)//深度优先遍历。相当于先序遍历
{
int i;
printf("当前DFS遍历的顶点为:%c\n",G->vertexs[v]);//首先访问。
visited[v]=1;
for(i=0;i<G->vexnum;i++)
if(!visited[i]&&G->arc[v][i]==1)//该节点没有被访问过,而且是刚才访问节点的邻接点(比如我们访问的是无向图的时候,我们访问过[1,3],但是我们访问点点3,就不会访问[3,1],因为visited[1]=1)
DFS(G,i);//接着以该邻接顶点为顶点,递归。()
return ;
}
void BFSTraverse(GraphType*G)
{
int i;
SepQueue queue;
queue.front=queue.rear=0;//队列的初始化。
for(i=0;i<G->vexnum;i++)
visited[i]=0;
for(i=0;i<G->vexnum;i++)
if(!visited[i])
BFS(G,i,&queue);
return ;
}
void BFS(GraphType*G,int v,SepQueue*queue)//相当于层次遍历(先访问-》标记-》入队)
{
int j,k;
printf("当前BFS遍历的顶点为:%c\n",G->vertexs[v]);
visited[v]=1;
queue->data[queue->rear++]=v;
while(queue->rear!=queue->front)//直到队列为空
{
j=queue->data[queue->front++];//将队头元素出列
for(k=0;k<G->vexnum;k++)
if(!visited[k]&&G->arc[j][k]==1)//将该节点的所有顶点都入队。(相当于二叉树的层次遍历)
{
printf("当前BFS遍历的顶点为:%c\n",G->vertexs[k]);
visited[k]=1;
queue->data[queue->rear++]=k;
}
}
return;
}
0 0
- 数据结构 邻接矩阵的BFS DFS
- 图的邻接矩阵表示(DFS,BFS)
- 邻接矩阵图的dfs和bfs
- 邻接矩阵的DFS 和 BFS 搜索遍历
- 图的BFS和DFS在数据结构为邻接矩阵时的实现
- [数据结构]图基于邻接矩阵的BFS与DFS的C语言简单实现
- (编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS
- 复习(数据结构):图:c语言:邻接矩阵DFS和BFS
- 数据结构 邻接矩阵+邻接表+bfs+dfs+prim+Kruskal综合
- 数据结构 邻接矩阵 DFS
- 数据结构 学习笔记(七):图(上):图的表示方法(邻接表,邻接矩阵),遍历(DFS,BFS)
- 邻接矩阵 遍历 DFS And BFS~~~
- 邻接矩阵实现图的存储,DFS,BFS遍历
- java版 图的邻接表、邻接矩阵、BFS、DFS 实现
- 图的邻接矩阵表示 DFS 和BFS C++实现
- C语言实现图的邻接矩阵和BFS DFS
- 在邻接矩阵中的DFS与BFS的实现
- 有向图的DFS和BFS(邻接矩阵实现)
- ubuntu12.10上安装wine遇到的一些问题
- Codeforces Round #387 (Div. 2) E. Comments
- Codeforces 747B Mammoth's Genome Decoding(碱基对)
- Windows或Linux系统中备份和恢复MongoDB数据的教程
- 对输入的字符串中C关键词的查找统计。
- 数据结构 邻接矩阵的BFS DFS
- 自定义集合
- 2016.12.12 锋利的jQueryCH11--性能优化和技巧
- ajax异步刷新邂逅了你—innerHTML
- HDU 2539 点球大战
- 翻译《有关编程、重构及其他的终极问题?》——11.不要试图把尽量多的操作符放到一行代码里
- 第十七周oj项目B: 结构体
- MyBatis学习(二):解析MyBatis配置文件的写法和使用原理
- c++函数部分