图的遍历:宽度优先遍历

/*
    图的遍历:宽度优先遍历
    队列
    2014-4-3 09:14:41
*/

/*
    测试数据
9 12
5 8 29
6 1 12
8 3 11
1 2 4
3 1 22
4 3 17
7 4 25
6 5 9
8 7 7
1 6 9
3 2 19
6 7 4

*/

#include <iostream>
#include <cstdlib>
#define MAX 10000
using namespace std;

int head[MAX]; //存储节点数组中起点为i的位置,0为结束标记
struct Node{
    int to, w, next; //起点,权值,下一点
};
Node Edges[MAX];

bool s[MAX];
int queue[MAX];

/*void DFS(int x){
    s[x] = true; //标记当前点已被访问
    printf("%d\n", x);
    int i;
    //对于每个未被访问的相邻节点,使用DFS。遍历返回后尝试其他支路
    for(i = head[x]; i != 0; i = Edges[i].next){
        if(s[Edges[i].to] == false) DFS(Edges[i].to);
    }
}*/

void BFS(int x){
    int iq = 0;
    queue[iq++] = x;	
    int i, k;
    for(i = 0; i < iq; ++i){
        //每次从队头取节点,一定是下一个待扩展节点
        printf("%d\n", queue[i]);
        s[queue[i]] = 1;
        //遍历与当前节点相连的节点,如果没有被访问,入队
        for(k = head[queue[i]]; k; k = Edges[k].next){
            if(!s[Edges[k].to]){
                queue[iq++] = Edges[k].to;
            }
        }
    }
}


int main(){
    int n, m; //n个点,m条边
    int to, from, w;
    
    //存储
    cin >> n >> m;
    for(int i = 0; i < m; ++i){
        cin >> from >> to >> w;
        Edges[i].to = to;
        Edges[i].w = w;
        Edges[i].next = head[from];
        head[from] = i; //更新
    }
    
    /*//遍历
    for(int i = 1; i <= n; ++i){
        for(int j = head[i]; j != 0; j = Edges[j].next)
            cout << i << ' ' << Edges[j].to << ' ' << Edges[j].w << endl;
    }*/
    
    /*//DFS
    DFS(1);*/
    BFS(1);
    system("pause");
    return 0;
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/chang_mu/article/details/22897791
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞