您的位置:首页 > 其它

邻接矩阵 遍历 DFS And BFS~~~

2017-08-04 17:56 267 查看
1 邻接矩阵 DFS(深度优先搜索)

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: