注:采用邻接矩阵递归的算法,在前面的博文中有非递归算法,包括邻接表的深搜 。
Description |
利用深度优先搜索算法,对给定无向图进行深度优先搜索并输出生成树序列。 默认由图中最小序号结点开始,并按照结点序号升序优先。 输入: 输入第一行为结点数,第二行至最后为各边,如:1 2 表示结点1与结点2有边。 |
Sample Input |
6 1 2 1 3 2 4 2 5 3 6 |
Sample Output |
1 2 4 5 3 6 |
Hint |
输出有换行。 |
#include <bits/stdc++.h>
#define Max_size 105
#define INTSIZE 32576
using namespace std;
// 邻接矩阵
typedef struct Arcell
{
int adj;
} Arcell, adjMa[Max_size][Max_size];
typedef struct
{
int vexs[Max_size];
adjMa arcs;
int vex, arc;
} MG;
void creatMG(MG &G)
{ // 创建不带权无向图
int n, v1, v2;
cin >> n;
G.vex = n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{ // 初始化
G.arcs[i][j].adj = 0;
}
}
while (cin >> v1 >> v2)
{
G.arcs[v1][v2].adj = 1;
G.arcs[v2][v1].adj = 1;
}
}
int v[Max_size]; // 辅助数组
int flag = 0;
void DFS(MG G, int j)
{
v[j] = 1; // 标记
if (flag != 0)
cout << " ";
else
flag = 1;
cout << j;
for (int w = 1; w <= G.vex; w++)
{ // 表示从j到w有边
if (!v[w] && G.arcs[j][w].adj != 0) // 未访问并且有边就递归
DFS(G, w);
}
}
void DFSTrav(MG G)
{
for (int i = 0; i <= G.vex; i++)
{ // 辅助数组初始化
v[i] = 0;
}
for (int j = 1; j <= G.vex; j++)
{
if (!v[j]) // 未访问就进人
DFS(G, j);
}
}
int main()
{
MG G;
adjMa p;
creatMG(G);
DFSTrav(G);
cout << "\n";
return 0;
}