您的位置:首页 > 其它

图算法:广度优先遍历

2013-06-25 22:04 204 查看
图的遍历算法包括广度优先遍历和深度优先遍历。其中深度遍历主要用于解答树问题的求解,而深度遍历往往为了获得最短路径解。什么是最短路径解呢?视具体情况而定,比如最短的迭代步数。在一般的隐式图中很常见,因为隐式图的规模往往是无穷的。

对于一般问题怎么思考呢?我想主要分三个步骤:分析问题(解答树or最短路径);套用框架;剪枝优化。

下面给出广度优先遍历的基本框架,关键词:队列。

#include <queue>
#include <cstring>
#include <cstdio>

#define ONLINE 1

using namespace std;

int graph[8][8];
int visited[8];

queue<int> q;

char s[8];

void bfs(int root)
{
q.push(root);

while (!q.empty())
{
int k = q.front(); q.pop();
if (visited[k] != 1)
{
printf("%d ", k); visited[k] = 1;
}

for (int j = 0; j < 8; j++)
{
if (graph[k][j] == 1 && visited[j] != 1)
{
q.push(j);
}
}
}
}

int main(int argc, char *argv[])
{
#if ONLINE
freopen("graph.txt", "r", stdin);
#endif

for (int i = 0; i < 8; i++)
{
fscanf(stdin, "%s", s);
for (int j = 0; j < 8; j++)
{
graph[i][j] = s[j] - '0';
}
}

memset(visited, 0, 8 * sizeof(int));

for (int i = 0; i < 8; i++)
{
if (visited[i] == 0)
{
bfs(i);
}
}
return 0;
}


明天打算研究倒水问题,应用这一方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: