您的位置:首页 > 其它

图的深度优先搜索和广度优先搜索

2015-09-10 15:59 417 查看
  图论中最粗暴的遍历方式非DFS和BFS莫属了。但是正是这种粗暴的方式,在笔试中被考察的概率非常的大。并且作为压轴题目,成为了一种危险的存在。a dangerous existence

  好了,言归正传。图的存储方式,我们使用的是邻接矩阵matrix,顶点的编号一般从1开始,但是数组却从0开始。所以,如果编号为i的顶点和编号为j的顶点如果存在一条无向边,那么我们记为:matrix[i-1][j-1]

  以上把定义都说明白了,下面,看代码。

const int vertexCount = 8;
byte[,] matrix = new byte[8, 8];
bool start = true;
bool[] visit;

// 第一次进行时,初始化visit,表示所有顶点都没有遍历
void DFS_Init()
{
visit = new bool[vertexCount];
for (int i = 0; i < vertexCount; i++)
{
visit[i] = false;
}
}

// 递归
void DFS_Recursive(int v)
{
Console.WriteLine(v); // 访问该顶点
visit[v-1] = true;
for (int i = 0; i < vertexCount; i++)
{
if (!visit[i] && matrix[v-1, i] == (byte)1)  // 如果该顶点没有被访问过,并且与顶点v存在边Ev,i
{
DFS_Recursive(i+1);  //数组下标为i,顶点编号为i+1
}
}

}

// 非递归
void DFS(int v)
{
Console.WriteLine(v);
visit[v] = true;
Stack<int> stack = new Stack<int>();
stack.Push(v);
while (stack.Count > 0)
{
v = stack.Peek();
int i;
for (i = 0; i < vertexCount; i++)
{
if (!visit[i] && matrix[v - 1, i] == (byte)1)  // 如果该顶点没有被访问过,并且与顶点v存在边Ev,i
{
Console.WriteLine(i+1);
visit[i] = true;
stack.Push(i+1);
break;
}

}
if (i == vertexCount)
{
stack.Pop();  //如果通过该顶点不能再访问其他顶点时,出栈
}
}
}


广度优先搜索

void BFS(int v)
{
Console.WriteLine(v);
visit[v - 1] = true;
Queue<int> queue = new Queue<int>();
queue.Enqueue(v);
while (queue.Count > 0)
{
v = queue.Dequeue();
for (int i = 0; i < vertexCount; i++)
{
if (!visit[i] && matrix[v - 1, i] == (byte)1)
{
Console.WriteLine(i + 1);
visit[i] = true;
queue.Enqueue(i + 1);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: