算法基础——DFS遍历与BFS遍历

DFS遍历

/*
5 5
1 2
1 3
1 5
2 4
3 5
*/

#include <iostream>
using namespace std;

static const int INF = 999999;//无穷大
int sum = 0;
int n,e[101][101],book[101];

void dfs(int cur){//cur为当前节点编号
    cout<<cur<<endl;
    sum++;
    if(sum==n){//访问完所有节点
        return;
    }
    for(int i=1;i<=n;i++){
        if(e[cur][i]==1&&book[i]==0){//如果当前节点和i节点相连并且没有被访问
            book[i]=1;
            dfs(i);//以顶点i再次出发
        }
    }
    return;
}

int main(){

    int m;
    cin>>n>>m;//n为顶点总个数
    int a,b;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){//初始化
            if(i==j){
                e[i][j]=0;
            }else{
                e[i][j]=INF;
            }
        }
    }
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        e[a][b]=1;
        e[b][a]=1;
    }

    book[1]=1;
    dfs(1);


    return 0;
}

同一道题,DFS遍历

//BFS遍历
/*
5 5
1 2
1 3
1 5
2 4
3 5
*/
#include <iostream>
using namespace std;

int book[101],e[101][101];
static const int INF = 99999;

int main(){

    int n,m,a,b,cur;
    int que[10001],head,tail;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){//初始化
            if(i==j){
                e[i][j]=0;
            }else{
                e[i][j]=INF;
            }
        }
    }
    for(int i=1;i<=m;i++){//读入边
        cin>>a>>b;
        e[a][b]=1;
        e[b][a]=1;
    }
    //队列初始化
    head = 1;
    tail = 1;
    //从1结点出发
    que[tail]=1;
    tail++;
    book[1]=1;
    
    while(head<tail){//当队列不为空时
        cur = que[head];
        for(int i=1;i<=n;i++){
            if(e[cur][i]==1&&book[i]==0){
                que[tail]=i;
                tail++;
                book[i]=1;
            }
            if(tail>n){
                break;
            }
        }
        head++;
    }
    for(int i=1;i<tail;i++){
        cout<<que[i]<<" ";
    }
    return 0;
}
发布了287 篇原创文章 · 获赞 297 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104242068