#include <stdio.h>

#define INF 32767
typedef struct MGraph{
char vertexs[];
int edge[][];
int ver_num, edge_num;
}MGraph; void create_graph(MGraph *graph)
{
int i, j;
getchar();
for(i = ; i < graph->ver_num; ++i)
scanf("%c%*c",&(graph->vertexs[i])); for(i = ; i < graph->ver_num; ++i)
{
for(j = ; j < graph->ver_num; ++j)
{
if(i == j)
graph->edge[i][i] = ;
else
graph->edge[i][j] = INF;
}
}
int vi, vj, val;
for(i = ; i < graph->edge_num; ++i)
{
scanf("%d %d %d", &vi, &vj, &val);
graph->edge[vi][vj] = graph->edge[vj][vi] = val;
}
} void print_graph(MGraph graph)
{
int i,j;
for(i = ; i < graph.ver_num; ++i)
{
for(j = ; j < graph.ver_num; ++j)
{
printf("%d\t", graph.edge[i][j]);
}
puts("");
}
} int vis[];
void dfs(MGraph graph, int vertex)
{
int i;
vis[vertex] = ; //将该结点标记为访问过
printf("%d -> %c\t", vertex, graph.vertexs[vertex]); //打印结点信息,当然也可以是其他操作 for(i = ; i < graph.ver_num; ++i)
{ //从vertex 到 i 有路径存在,而且 i 结点未被访问过
if(graph.edge[vertex][i] > && graph.edge[vertex][i] != INF && !vis[i])
dfs(graph, i); //进行dfs遍历
}
} void dfstraverse(MGraph graph)
{
int i;
for(i = ; i < graph.ver_num; ++i) //将所有结点标记为未访问过
vis[i] = ;
for(i = ; i < graph.ver_num; ++i) //从每个未被访问过的结点开始进行dfs遍历
if(!vis[i])
dfs(graph, i);
} typedef struct Queue{
int store[];
int front, rear;
}Queue; void InitQueue(Queue *queue)
{
queue->front = queue->rear = ;
}
void EnQueue(Queue *queue , int i)
{
if(queue->rear == )
puts("the queue is full!!");
else{
queue->store[queue->rear] = i;
queue->rear++;
}
} int DeQueue(Queue *queue)
{
if(queue->rear == queue->front)
printf("the queue is empty!!");
else{
queue->front++;
return queue->store[queue->front-];
}
} Queue queue; //定义队列
void bfs(MGraph graph, int vertex)
{
int i, tmp;
vis[vertex] = ;
printf("%d -> %c\t",vertex, graph.vertexs[vertex]);
EnQueue(&queue, vertex); while(queue.front != queue.rear)
{
tmp = DeQueue(&queue);
for(i = ; i < graph.ver_num; ++i)
{
if(graph.edge[tmp][i] > && graph.edge[tmp][i] != INF && !vis[i])
{
vis[i] = ;
printf("%d -> %c\t", i, graph.vertexs[i]);
EnQueue(&queue, i);
}
}
}
} void bfstraverse(MGraph graph)
{
int i;
InitQueue(&queue);
for(i = ; i < graph.ver_num; ++i)
vis[i] = ;
for(i = ; i < graph.ver_num; ++i)
if(!vis[i])
bfs(graph, i);
} int main()
{
MGraph graph;
scanf("%d %d", &(graph.ver_num), &(graph.edge_num));
create_graph(&graph);
print_graph(graph);
dfstraverse(graph);
puts("");
bfstraverse(graph);
return ;
}
/*
4 4
0 1 2 3
0 1 9
1 2 8
2 3 7
3 0 6
* */

基于邻接矩阵的 DFS & BFS

 #include <stdio.h>
#include <string.h>
#include <stdlib.h> typedef struct ArcNode{
int adjVex; //邻接点域
struct ArcNode *next; //指针域
}ArcNode; //边表 typedef struct VertexNode{
int data; //顶点域
struct VertexNode *firstArc;//边表头指针
}VertexNode, AdjList[]; //顶点表 typedef struct {
AdjList adjlist;
int ArcNum, VertexNum; //图中的顶点数和边数
}AdjListGraph;
/*
* 创建的是无向图,采用头插法建立边表
* */
int create_graph(AdjListGraph *graph)
{
int i, j;
for(i = ; i < graph->VertexNum; ++i)
{
graph->adjlist[i].data = i;
graph->adjlist[i].firstArc = NULL;
}
int m, n, val;
for(i = ; i < graph->ArcNum; ++i)
{
puts("the every arc");
scanf("%d %d", &m, &n);
ArcNode *tmp1 = (ArcNode*)malloc(sizeof(ArcNode));
if(tmp1 == NULL)
return ;
tmp1->adjVex = n;
tmp1->next = graph->adjlist[m].firstArc;
graph->adjlist[m].firstArc = tmp1; ArcNode *tmp2 = (ArcNode*)malloc(sizeof(ArcNode));
if(tmp2 == NULL)
return ;
tmp2->adjVex = m;
tmp2->next = graph->adjlist[n].firstArc;
graph->adjlist[n].firstArc = tmp2;
}
return ;
}
int vis[];
void dfs(AdjListGraph *graph, int vertex)
{
ArcNode *p;
vis[vertex] = ;
printf("%d\t", graph->adjlist[vertex].data);
p = graph->adjlist[vertex].firstArc; while(p)
{
if(!vis[p->adjVex])
dfs(graph, p->adjVex);
p = p->next;
}
}
void dfstreverse(AdjListGraph *graph)
{
int i;
for(i = ; i < graph->VertexNum; ++i)
{
vis[i] = ;
}
for(i = ; i < graph->VertexNum; ++i)
{
if(!vis[i])
dfs(graph, i);
}
} typedef struct Queue{
int store[];
int front, rear;
}Queue; void InitQueue(Queue *queue)
{
queue->front = queue->rear=;
}
void EnQueue(Queue *queue , int i)
{
if(queue->rear == )
puts("the queue is full!!");
else{
queue->store[queue->rear] = i;
queue->rear++;
}
} int DeQueue(Queue *queue)
{
if(queue->rear == queue->front)
printf("the queue is empty!!");
else{
queue->front++;
return queue->store[queue->front-];
}
} Queue queue;
void bfs(AdjListGraph *graph, int vertex)
{
int i, tmp;
ArcNode *p;
vis[vertex] = ;
printf("%d\t", graph->adjlist[vertex].data); EnQueue(&queue, vertex);
while(queue.front != queue.rear)
{
tmp = DeQueue(&queue);
p = graph->adjlist[tmp].firstArc;
while(p)
{
if(!vis[p->adjVex])
{
vis[p->adjVex] = ;
printf("%d\t", graph->adjlist[p->adjVex].data);
EnQueue(&queue, p->adjVex);
}
p = p->next;
} }
} void bfstreverse(AdjListGraph *graph)
{ InitQueue(&queue);
int i;
for(i = ; i < graph->VertexNum; ++i)
vis[i] = ;
for(i = ; i < graph->VertexNum; ++i)
if(!vis[i])
bfs(graph, i);
}
int main()
{
AdjListGraph graph;
int arc_num, ver_num;
puts("input the arc_num & ver_num\n");
scanf("%d %d", &arc_num, &ver_num);
graph.ArcNum = arc_num;
graph.VertexNum = ver_num;
create_graph(&graph);
dfstreverse(&graph);
bfstreverse(&graph);
return ;
}

基于邻接表的 DFS & BFS

手写又不熟了,多多看,多多练!

图的基本遍历算法的实现(BFS & DFS)复习的更多相关文章

  1. 图的广度优先遍历算法(BFS)

    在上一篇文章我们用java演示了图的数据结构以及图涉及到的深度优先遍历算法,本篇文章将继续演示图的广度优先遍历算法.广度优先遍历算法主要是采用了分层的思想进行数据搜索.其中也需要使用另外一种数据结构队 ...

  2. 图的创建和遍历(BFS/DFS)

    图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...

  3. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. 图的深度优先遍历算法(DFS)

    搜索算法有很多种,本次文章主要分享图(无向图)的深度优先算法.深度优先算法(DFS)主要是应用于搜索中,早期是在爬虫中使用.其主要的思想有如下: 1.先访问一个节点v,然后标记为已被访问过2.找到第一 ...

  5. 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)

    数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...

  6. 算法导论—无向图的遍历(BFS+DFS,MATLAB)

    华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 ...

  7. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  8. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  9. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

随机推荐

  1. C语言位域

    转载自 http://tonybai.com/2013/05/21/talk-about-bitfield-in-c-again/ 再谈C语言位域 五 21 bigwhite技术志 bitfield, ...

  2. CentOS系统IPTables防火墙中FTP规则设置

    时间 2016-04-21 10:32:15  虫虫开源 原文  http://www.sijitao.net/2403.html 主题 iptablesFTP防火墙 在设置ftp通过iptables ...

  3. js的DOM的方法和属性总结

    1.DOM的获取元素document.getElementById()context.getElementsByTagName(tag) (可以获取相应上下文环境所有的tag标签)context.ge ...

  4. DOM0编程与基础方法

    ## 这里记录一下DOM编程的基础与方法----### DOM 的O:对象 objectO表示Object,对象的意思.JavaScript中对象可以分为三种类型1. 用户定义对象(user-defi ...

  5. 变量声明---let,const,解构

    let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题. const是对let的一个增强,它能阻止对一个变量再次赋值. 块作用域 当用let声明一个变量,它使用的是 ...

  6. git: fatal: Not a git repository (or any of the parent directories): .git

    在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 ...

  7. java复杂枚举

    枚举以红绿灯为例,红灯30s后为绿灯,绿灯45s后为黄灯,黄灯5s后为红灯.具体的枚举代码如下: public enum TrafficLamp{ RED(30){ public TrafficLam ...

  8. mysqlDBA(1-3年)

    1.熟悉Aliyun操作系统的管理.配置和系统调优: 2.熟悉mysql管理 3.熟悉mysql主从复制,主主复制 4.熟悉数据库的备份策略,监控策略,性能测量策略 5.熟悉linux/unix操作系 ...

  9. React学习笔记-8-属性和状态详解

    属性的含义和用法props=properties 英文中属性的意思.属性不可以修改,也就是属性不可以由组件进行修改,组件的属性是由父组件传递过来的,相当于组件在出生的时候带的.用法第一种:直接在调用组 ...

  10. bootstrap-table分页第二篇 延续上一篇的

    这个是service/** * 返回记录数 * @return */ public Integer getPageTotal(Integer userid); //service的实现类 public ...