#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. sql查找去重复并且字段不为空的数据

    select distinct username,quantity  from Student where isnull(username,'')<>'' and p_id = {1}

  2. BZOJ 3639: Query on a tree VII

    Description 一棵树,支持三种操作,修改点权,修改颜色,问所有与他路径上颜色相同的点的最大权,包含这两个点. Sol LCT. 用LCT来维护重边,对于每个节点在建一个set用来维护轻边,这 ...

  3. 用open_gapps安装google play

    说明  一个开放源码脚本自动生成最新的谷歌应用程序包.对整个google play 程序框架的打包,包括一些google官方的程序.对于阉割了google ply用户来说是一个不错的选择. 使用 下载 ...

  4. html5 选择元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. ubuntu 16.04安装docker

    环境 操作系统:ubuntu 16.04 64位,默认安装 准备 1. 添加GPG key: $ sudo apt-key adv --keyserver hkp://p80.pool.sks-key ...

  6. 在WPF中使用变通方法实现枚举类型的XAML绑定

    问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我 ...

  7. Java获取用户ip

    /** * 获取客户端ip地址(可以穿透代理) * * @param request * @return */ public static String getRemoteAddr(HttpServl ...

  8. 我的CodeF水A题之路

    Codeforces Round #359 (Div. 2) A. Free Ice Cream 题目链接:http://www.codeforces.com/problemset/problem/6 ...

  9. Android笔记:蓝牙

    if (!BTAdapter.isEnabled()) { //没有打开,就启动确认窗口询问用户是否打开 Intent i = new Intent(BluetoothAdapter.ACTION_R ...

  10. Ajax请求跨域问题 -- 转载

    几乎每种浏览器都存在默认的安全机制,都有同源策略,因为浏览器恶意的把每个外部请求的都当做是黑客攻击,相当于是对自身的保护,所以浏览器在运行脚本时会判断脚本与请求的页面是否是同一来源,这个同一来源,包括 ...