//深度优先搜索测试
//例:
// 1
// / | \
// / | \
// 2 3---5
// |
// |
// 4
//step1:将存储图的方法称为图的*邻接矩阵存储法*
// 通路用1表示,不通用-1表示,自身为0
// 1 2 3 4 5
// 1 0 1 1 -1 1
// 2 1 0 -1 1 -1
// 3 1 -1 0 -1 1
// 4 -1 1 -1 0 -1
// 5 -1 -1 1 -1 0
// step2:构造二维表
const int NUM = 100;
int road[NUM][NUM]; //记录通路
bool book[NUM]; //记录是否已经被访问
void BounTable(int n) //初始化
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
road[i][j] = (i == j) ? 0 : -1;
}
void RoadSet() //路径设置
{
road[1][2] = road[2][1] = 1;
road[1][3] = road[3][1] = 1;
road[2][4] = road[4][2] = 1;
road[3][5] = road[5][3] = 1;
road[1][5] = road[5][1] = 1;
}
void BookSet(int n) //未访问的节点设置为true,为了防止重复访问
{
for(int i = 1; i <= n; i++)
book[i] = true;
}
//v当前节点编号;sum累计访问节点个数;n节点总个数
void dfs(int v,int& sum, int& n) //深度优先搜索
{
cout << v <<" "; //输出当前的节点
sum++;
if(sum == n) return; //若累计访问节点个数等于节点总数,则返回
for(int i = 1; i <= n; i++)
{
if(road[v][i] == 1 && book[i])
{
book[i] = false;
dfs(i,sum,n); //从当前节点往下访问
}
}
}
//深度优先搜索
void dfsTest()
{
int n = 5,sum = 0;
BounTable(n);
RoadSet();
BookSet(n);
book[1] = false;
dfs(1,sum,n);
getchar();
}
//输出 1 2 4 3 5