图的遍历(DFS、BFS)实现

DFS

测试样例

样例输入:

0 1 0 0 0 0 0 1 0 0
1 0 1 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 1 1 1 0 0 0
0 0 0 1 0 1 0 0 0 0
0 0 0 1 1 0 1 0 0 0
0 0 0 1 0 1 0 0 0 0
1 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1 1 0

样例输出:

dfs遍历结果:
1 2 3 4 5 6 7 8 9 10

实现代码

#include<bits/stdc++.h> 
using namespace std;  
int a[11][11];  
bool visited[11];  

//邻接矩阵存储图 
void store_graph() {  
    int i,j;
    for(i = 1; i <= 10; i++)  
        for(j = 1; j <= 10; j++)  
            cin >> a[i][j];  
}

//深度遍历图  
void dfs_graph() {  
    void dfs(int v);
    memset(visited, false, sizeof(visited));  
    for(int i = 1;i <= 10; i++)  //遍历每个顶点是为了防止图不连通时无法访问每个顶点  
        if(visited[i] == false)  
            dfs(i);
}

//深度遍历顶点 
void dfs(int v) {
    int Adj(int x);  
    cout << v << " ";  //访问顶点v 
    visited[v] = true;
    int adj = Adj(v);
    while(adj != 0) {  
        if(visited[adj] == false)
            dfs(adj);      //递归调用是实现深度遍历的关键所在  
        adj=Adj(v);
    }
}

//求邻接点 
int Adj(int x) { 
    for(int i = 1; i <= 10; i++)  
        if(a[x][i] == 1 && visited[i] == false)  
            return i;
    return 0;  
}
  
int main() {  
    cout << "初始化图:" << endl;  
    store_graph();
    cout << "dfs遍历结果:" << endl;  
    dfs_graph();  
    return 0;  
} 

BFS

测试样例

样例输入:

0 1 0 0 0 0 0 1 0 0
1 0 1 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 1 1 1 0 0 0
0 0 0 1 0 1 0 0 0 0
0 0 0 1 1 0 1 0 0 0
0 0 0 1 0 1 0 0 0 0
1 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1 1 0

样例输出:

bfs遍历结果:
1 2 8 3 4 9 10 5 6 7

实现代码

#include<bits/stdc++.h> 
using namespace std;  
int a[11][11];  
bool visited[11];  
  
void store_graph() {  
    for(int i = 1;i <= 10; i++)  
        for(int j = 1; j <= 10; j++)  
            cin >> a[i][j];  
}
  
void bfs_graph() {  
    void bfs(int v);  
    memset(visited, false, sizeof(visited));  
    for(int i = 1; i <= 10; i++)    
        if(visited[i] == false)  
            bfs(i);
}
  
void bfs(int v) {  
    int Adj(int x);
    queue<int> myqueue;  
    int adj, temp;  
    cout << v << " ";  
    visited[v] = true;  
    myqueue.push(v);  
    while(!myqueue.empty()) {   //队列非空表示还有顶点未遍历到 
        temp = myqueue.front();  //获得队列头元素
        myqueue.pop();         //头元素出队
        adj = Adj(temp);
        while(adj != 0) {  
            if(visited[adj] == false) {  
                cout << adj << " ";  
                visited[adj] = true;  
                myqueue.push(adj);   //进队
            }
            adj = Adj(temp);  
        }  
    }  
}  
  
int Adj(int x) {  
    for(int i = 1;i <= 10; i++)  
        if(a[x][i] == 1 && visited[i] == false)  
            return i;
    return 0;  
}  
  
int main() {  
    cout << "初始化图:" << endl;  
    store_graph();
    cout << "bfs遍历结果:" << endl;  
    bfs_graph();  
    return 0;  
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值