一、深度优先搜索
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
const int N = 60;
int n;
int vex[N], matrix[N][N];
/*
* 输入矩阵队列图
*/
void scanf_graph(int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n; j++)
scanf("%d ", &matrix[i][j]);
// printf("\n");
}
}
/*
* 创建图(自己输入)
*/
void create_graph(int n)
{
// 初始化"顶点"
for (int i = 0; i < n; i ++) vex[i] = i;
scanf_graph(n);
}
/*
* 返回顶点v的第一个邻接顶点的索引,失败则返回-1
*/
static int first_vertex(int v)
{
if (v<0 || v>(n-1)) return -1;
for (int i = 0; i < n; i++)
if (matrix[v][i] == 1)
return i;
return -1;
}
/*
* 返回顶点v相对于w的下一个邻接顶点的索引,失败则返回-1
*/
static int next_vertix(int v, int w)
{
if (v<0 || v>(n-1) || w<0 || w>(n-1)) return -1;
for (int i = w + 1; i < n; i++)
if (matrix[v][i] == 1)
return i;
return -1;
}
static void DFS(int i, int *visited)
{
// 标记为1 代表已访问
visited[i] = 1;
printf("%d ", vex[i]);
// 遍历该顶点的所有邻接顶点。w为邻接顶点索引,若是没有访问过,那么继续往下走
for (int w = first_vertex(i); w >= 0; w = next_vertix(i, w))
if (!visited[w])
DFS(w, visited);
}
/*
* 深度优先搜索遍历图
*/
void DFSTraverse()
{
int i;
int visited[N]; // 顶点访问标记
// 初始化所有顶点都没有被访问
for (i = 0; i < n; i++) visited[i] = 0;
for (i = 0; i < n; i ++)
if (!visited[i])
DFS(i, visited);
printf("\n");
}
int main(void)
{
scanf("%d", &n);
create_graph(n);
DFSTraverse();
}
二、广度优先搜索
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
const int N = 60;
int n;
int vex[N], matrix[N][N];
/*
* 输入矩阵队列图
*/
void scanf_graph(int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n; j++)
scanf("%d ", &matrix[i][j]);
// printf("\n");
}
}
/*
* 创建图(自己输入)
*/
void create_graph(int n)
{
// 初始化"顶点"
for (int i = 0; i < n; i ++) vex[i] = i;
scanf_graph(n);
}
/*
* 返回顶点v的第一个邻接顶点的索引,失败则返回-1
*/
static int first_vertex(int v)
{
if (v<0 || v>(n-1)) return -1;
for (int i = 0; i < n; i++)
if (matrix[v][i] == 1)
return i;
return -1;
}
/*
* 返回顶点v相对于w的下一个邻接顶点的索引,失败则返回-1
*/
static int next_vertix(int v, int w)
{
if (v<0 || v>(n-1) || w<0 || w>(n-1)) return -1;
for (int i = w + 1; i < n; i++)
if (matrix[v][i] == 1)
return i;
return -1;
}
/*
* 广度优先搜索(类似于树的层次遍历)
*/
void BFS()
{
int head = 0;
int rear = 0;
int queue[N]; // 辅组队列
int visited[N]; // 顶点访问标记
int i, j, k;
for (i = 0; i < n; i ++) visited[i] = 0;
for (i = 0; i < n; i ++)
{
if (!visited[i])
{
visited[i] = 1;
printf("%d ", vex[i]);
queue[rear++] = i; // 入队列
}
while (head != rear)
{
j = queue[head++]; // 出队列
for (k = first_vertex(j); k >= 0; k = next_vertix(j, k)) //k是为访问的邻接顶点
{
if (!visited[k])
{
visited[k] = 1;
printf("%d ", vex[k]);
queue[rear++] = k;
}
}
}
}
printf("\n");
}
int main(void)
{
scanf("%d", &n);
create_graph(n);
BFS();
}
版权声明:本文为weixin_52167761原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。