1.深度优先搜索
深度优先搜索类似于树的先序遍历,是树的先序遍历的拓展。从起始点开始沿着一个能访问的相邻点一直搜索下去,直到这条路线的尽头,再返回到上一个分叉的顶点搜索另一条路线。这显然一个递归算法,我们可以使用递归或者栈来解决。
2.广度优先搜索
广度优先搜索是从初始顶点开始搜索所有未访问的相邻顶点,然后分别从这些相邻点出发依次访问它们的相邻点。一般会使用队列来解决广度优先搜索。
3.算法代码
/*遍历*/
/// <summary>
/// 找到一个相邻却为访问过的定点
/// </summary>
/// <param name="v"></param>
/// <returns></returns>
private int GetAdjUnvisitedVertex(int v)
{
for (int i = 0; i < numVert; i++)
{
if (adjmatrix[v, i] != 0 && !vertices[i].IsVisit) //adjmatrix是邻接矩阵,vertices是存放定点的数组
{
return i;
}
}
return -1;
}
/// <summary>
/// 深度优先算法
/// </summary>
public void DepthFirstSearch()
{
for (int i = 0; i < numVert; i++)
{
if (!vertices[i].IsVisit) //若为访问过
DepthFirstRecursion(i);
}
//重置访问标识符
for (int i = 0; i < numVert; i++)
{
vertices[i].IsVisit = false;
}
Console.WriteLine();
}
/// <summary>
/// 深度优先递归
/// </summary>
/// <param name="point"></param>
private void DepthFirstRecursion(int point)
{
if (vertices[point].IsVisit == true) return; //已经被访问过就返回
vertices[point].IsVisit = true; //修改访问标识符
DisplayVert(point); //输出顶点信息
int next = GetAdjUnvisitedVertex(point); //获取一个相邻顶点
while (next != -1)
{
DepthFirstRecursion(next); //递归访问下一个顶点
next = GetAdjUnvisitedVertex(point);
}
}
/// <summary>
/// 广度优先算法
/// </summary>
public void BreadthFirstSearch()
{
for (int i = 0; i < numVert; i++)
{
if (!vertices[i].IsVisit)
{
BreadthFirst(i);
}
}
//重置访问表示符
for (int i = 0; i < numVert; i++)
{
vertices[i].IsVisit = false;
}
Console.WriteLine();
}
/// <summary>
/// 广度优先队列
/// </summary>
/// <param name="i"></param>
private void BreadthFirst(int i)
{
Queue queue = new Queue(); //用于存放定点的队列
queue.Enqueue(i); //放入第一个顶点到队列中
DisplayVert(i); //显示顶点信息
vertices[i].IsVisit = true; //修改访问标识符
while (queue.Count > 0) //队列不为空则一直循环
{
int vert1 = (int)queue.Dequeue(); //从队列中取出顶点
int vert2 = GetAdjUnvisitedVertex(vert1); //寻找与vert1的相邻顶点
//找到所有与vert1相邻的顶点并输出,并将所有找到的顶点输出且加入队列中
while (vert2 != -1)
{
queue.Enqueue(vert2);
DisplayVert(vert2);
vertices[vert2].IsVisit = true;
vert2 = GetAdjUnvisitedVertex(vert1);
}
}
}