图的深度优先搜索遍历
Problem Description
输入一个图然后对其进行深度优先搜索
Input
第一行输入顶点个数
第二行输入顶点的值(信息)
第三行输入边的个数
第四行开始输入所有边的端点
Output
输出邻接矩阵,
输出该图的DFS遍历
Sample Input
6
3 6 5 4 9 8
6
3 6
3 4
5 9
3 5
9 8
3 8
Sample Output
输出邻接矩阵:
3 6 5 4 9 8
3 0 1 1 1 0 1
6 1 0 0 0 0 0
5 1 0 0 0 1 0
4 1 0 0 0 0 0
9 0 0 1 0 0 1
8 1 0 0 0 1 0
图的DFS遍历结果: 3 6 5 9 8 4
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
/*
* 名称: 图的遍历
* 方法: 邻接矩阵储存+深度优先搜索进行遍历(DFS)
* by : mazicwong
* 专业: 软件工程
*/
/*
6
3 6 5 4 9 8
6
3 6
3 4
5 9
3 5
9 8
3 8
*/
/*
这里如果在前面用typedef char VERTYPE的话,后面的输出不能用printf和scanf来控制
只能够用成cin , cout
*/
//http://www.cnblogs.com/gentleming/archive/2010/08/06/1793903.html
const int MAX_VERTEX_NUM = 10;//最大顶点个数
typedef char VERTYPE;
typedef struct {
VERTYPE vexs[MAX_VERTEX_NUM];//顶点向量
int visited[MAX_VERTEX_NUM];//标志访问过的点
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;//当前顶点数和弧数
}mgraph,*MGraph;
void init_mgraph(MGraph &g) //初始化图
{
g = (MGraph)malloc(sizeof(mgraph));
g->vexnum = g->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++)
g->vexs[i] = 0; //顶点数组初始化
for (int i = 0; i < MAX_VERTEX_NUM; i++)
g->visited[i] = 0; //标记数组初始化
for (int i = 0; i < MAX_VERTEX_NUM; i++)
for (int j = 0; j < MAX_VERTEX_NUM; j++)
g->arcs[i][j] = 0;//邻接矩阵初始化
}
void add_vexs(MGraph &g) //增加点
{
printf("请输入顶点个数\n");
scanf("%d%*c", &g->vexnum);
printf("请输入顶点的值\n");
for (int i = 0; i < g->vexnum; i++)
scanf("%c%*c", &g->vexs[i]);
}
void add_arcs(MGraph &g) //增加边
{
printf("请输入边的个数\n");
scanf("%d", &g->arcnum);
VERTYPE ch1, ch2;
int row, col;
printf("请输入每条边的端点\n");
for (int i = 0; i < g->arcnum; i++)
{
getchar();
scanf("%c %c", &ch1, &ch2);
for (int j = 0; j < g->arcnum; j++) //找到那条边的两个点进行赋值
{
if (g->vexs[j] == ch1)
row = j;
if (g->vexs[j] == ch2)
col = j;
}
g->arcs[row][col] = 1;
g->arcs[col][row] = 1;//行和列在无向图的邻接矩阵是对称的,要加这一行
}
}
void creat_mgraph(MGraph &g)
{
add_vexs(g);
add_arcs(g);
}
void print_mgraph(MGraph &g)
{
printf("输出邻接矩阵:\n ");
for (int i = 0; i < g->vexnum; i++)
cout << " " << g->vexs[i];
puts("");
for (int i = 0; i < g->vexnum; i++)
{
printf("%c ", g->vexs[i]);
for (int j = 0; j < g->vexnum; j++)
printf("%d ", g->arcs[i][j]);
puts("");
}
}
void visit(MGraph &g, int i)
{
printf("%c ", g->vexs[i]);
g->visited[i] = 1;
}
void DFSTraverse(MGraph &g, int i) //从第i个顶点开始搜素
{
visit(g, i);
for (int j = 0; j < g->vexnum; j++)
{
if (g->arcs[i][j] && !g->visited[j])
DFSTraverse(g, j);
}
}
int main()
{
MGraph G;
init_mgraph(G);
creat_mgraph(G);
print_mgraph(G);
printf("图的DFS遍历结果: ");
DFSTraverse(G, 0);
return 0;
}