图算法:广度优先遍历

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

对于一般问题怎么思考呢?我想主要分三个步骤:分析问题(解答树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;    

}

明天打算研究倒水问题,应用这一方法。

 

 

你可能感兴趣的:(算法)