邻接矩阵 遍历 DFS And BFS~~~
2017-08-04 17:56
267 查看
1 邻接矩阵 DFS(深度优先搜索)
2 邻接矩阵 BFS(广度优先搜索)
完整代码实现
void dfs(Graph g, int i) { int j; visited[i] = TRUE; printf("%c ", g.vex[i]); for (j = 0; j < g.vex_num; j++) { if (!visited[j] && g.edge[i][j] != INFINITY && i != j) { dfs(g, j); visited[j] = TRUE; } } } void dfs_trvsal(Graph g) { int i; for (i = 0; i < g.vex_num; i++) { visited[i] = FALSE; } //dfs(g, 0); 对无向图而言 for (i = 0; i < g.vex_num; i++) { if (!visited[i]) dfs(g, i); } }
2 邻接矩阵 BFS(广度优先搜索)
void bfs(Graph g, int i) { Queue q; init_queue(&q); visited[i] = TRUE; printf("%c ", g.vex[i]); enqueue(i, &q); int j; while (!is_empty(q)) { j = q_front(q); dequeue(&q); int w; for(w = 0; w < g.vex_num; w++ ){ if (!visited[w] && g.edge[j][w] != 0 && g.edge[j][w] != INFINITY) { printf("%c ", g.vex[w]); visited[w] = TRUE; enqueue(w, &q); } } } } void bfs_trvsal(Graph g) { int i; for (i = 0; i < g.vex_num; i++) { visited[i] = FALSE; } for (i = 0; i < g.vex_num; i++) { if (!visited[i]) { bfs(g, i); } } }
完整代码实现
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<windows.h>
#define MAXVEX 100
#define INFINITY 65535
#define TRUE 1
#define FALSE 0
#define Bool int
Bool visited[MAXVEX];
typedef int EdgeType;
typedef char VertexType;
typedef struct QNode {
int front, rear;
int data[MAXVEX];
int size;
}Queue;
typedef struct Graph {
VertexType vex[MAXVEX];
EdgeType edge[MAXVEX][MAXVEX];
int vex_num, edge_num;
}Graph;
void init_queue(Queue *q)
{
q->front = q->rear = 0;
q->size = 0;
}
int is_empty(Queue q)
{
return q.front == q.rear;
}
int is_full(Queue q)
{
return (q.rear + 1) % MAXVEX == q.front;
}
void enqueue(int x, Queue *q)
{
if (!is_full(*q)) {
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MAXVEX;
q->size++;
}
}
void dequeue(Queue *q)
{
if (!is_empty(*q)) {
q->front = (q->front + 1) % MAXVEX;
q->size--;
}
}
int q_front(Queue q)
{
return q.data[q.front];
}
int get_q_len(Queue q)
{
return (q.front - q.rear + MAXVEX) % MAXVEX;
}
void print_q(Queue q)
{
int i;
for (i = q.front; i < q.front+q.size; i++) {
printf("%d", q.data[i%MAXVEX]);
}
}
void init_graph(Graph *g)
{
int i,j;
for (i = 0; i < g->vex_num; i++) {
for (j = 0; j < g->vex_num; j++) {
if (i == j) {
g->edge[i][j] = 0;
}
else
g->edge[i][j] = INFINITY;
}
}
}
char read_char()
{
char ch;
do {
ch = getchar();
} while (!isalpha(ch));
return ch;
}
int get_pos(Graph g,char ch)
{
int i;
for (i = 0; i < g.vex_num; i++) {
if (g.vex[i] == ch)
return i;
}
return -1;
}
void create_graph(Graph *g)
{
int i, w, k;
//printf("请输入顶点数与边数:\n");
scanf("%d%d", &g->vex_num,&g->edge_num);
init_graph(g);// 初始化
//printf("请输入顶点信息:\n");
for (i = 0; i < g->vex_num; i++) {
//scanf("%c", g->vex[i]);
g->vex[i] = read_char();
}
//printf("请输入边的信息:\n");
char c1, c2;
int p1, p2;
for (k = 0; k < g->edge_num; k++) {
c1 = read_char();
c2 = read_char();
scanf("%d", &w);
p1 = get_pos(*g, c1);
p2 = get_pos(*g, c2);
g->edge[p1][p2] = w;
g->edge[p2][p1] = g->edge[p1][p2];
}
}
void print_graph(Graph g)
{
int i, j;
for (i = 0; i < g.vex_num; i++) {
for (j = 0; j < g.vex_num; j++) {
if (g.edge[i][j] == INFINITY)
printf("%5c",'*');
else {
printf("%5d", g.edge[i][j]);
}
}
printf("\n");
}
}
void dfs(Graph g, int i) { int j; visited[i] = TRUE; printf("%c ", g.vex[i]); for (j = 0; j < g.vex_num; j++) { if (!visited[j] && g.edge[i][j] != INFINITY && i != j) { dfs(g, j); visited[j] = TRUE; } } } void dfs_trvsal(Graph g) { int i; for (i = 0; i < g.vex_num; i++) { visited[i] = FALSE; } //dfs(g, 0); 对无向图而言 for (i = 0; i < g.vex_num; i++) { if (!visited[i]) dfs(g, i); } }
void bfs(Graph g, int i) { Queue q; init_queue(&q); visited[i] = TRUE; printf("%c ", g.vex[i]); enqueue(i, &q); int j; while (!is_empty(q)) { j = q_front(q); dequeue(&q); int w; for(w = 0; w < g.vex_num; w++ ){ if (!visited[w] && g.edge[j][w] != 0 && g.edge[j][w] != INFINITY) { printf("%c ", g.vex[w]); visited[w] = TRUE; enqueue(w, &q); } } } } void bfs_trvsal(Graph g) { int i; for (i = 0; i < g.vex_num; i++) { visited[i] = FALSE; } for (i = 0; i < g.vex_num; i++) { if (!visited[i]) { bfs(g, i); } } }
int main()
{
Graph g;
Queue q;
//init_queue(&q);
//print_q(q);
create_graph(&g);
print_graph(g);
printf("\nDFS:\n\t");
dfs_trvsal(g);
printf("\n\nBFS:\n\t");
bfs_trvsal(g);
getchar();
getchar();
return 0;
}
相关文章推荐
- 数据结构 学习笔记(七):图(上):图的表示方法(邻接表,邻接矩阵),遍历(DFS,BFS)
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 数据结构-图-邻接矩阵深度和广度遍历DFS_BFS
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 邻接矩阵深度和广度遍历DFS_BFS.c
- 利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
- 图的遍历(DFS、BFS)使用邻接矩阵(数组)作为存储结构--C语言
- 邻接矩阵深度优先和广度优先遍历(DFS和BFS)
- 邻接矩阵实现图的存储,DFS,BFS遍历
- 邻接矩阵遍历(无向图,邻接矩阵,DFS,BFS)
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 图的遍历DFS与BFS(邻接矩阵)
- 【数据结构】邻接矩阵深度和广度遍历DFS_BFS
- 图的遍历(BFS与DFS)
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 图的遍历:DFS和BFS
- 【图】BFS遍历、DFS遍历、Topology排序、判断二分性
- 基于邻接表存储的图的DFS与BFS遍历
- 图的遍历-深搜(DFS)和广搜(BFS)
- 1094. The Largest Generation (25)[dfs|bfs遍历]