在邻接矩阵中的DFS与BFS的实现

来源:互联网 发布:英格拉姆弹跳数据 编辑:程序博客网 时间:2024/05/22 13:51

大致思路:

对于已经找到的 x,y 在矩阵中进行行遍历和列遍历。遇到存在的边则进行BFS或DFS

代码:

p.s 代码中均是以无向图为例

BFS

#include<bits/stdc++.h>using namespace std;const int maxn=110;typedef struct{    int x,y;}Node;int mp[maxn][maxn];queue<Node> q;void bfs(int x,int y,int n){    int cnt=1;    Node a;    a.x=x;a.y=y;    q.push({x,y});    while(!q.empty())    {        Node b=q.front();        q.pop();        for(int i=1;i<=n;++i){//行遍历和列遍历            if(mp[b.x][i]){                q.push({b.x,i});                mp[b.x][i]=0;//及时标记                mp[i][b.x]=0;                cnt++;            }            if(mp[i][b.y]){                q.push({i,b.y});                mp[i][b.y]=0;                mp[b.y][i]=0;                cnt++;            }        }    }    cout<<cnt<<endl;}void print(int n){    for(int i=1;i<=n;++i){        for(int j=1;j<=n;++j)            cout<<mp[i][j]<<" ";        cout<<endl;    }}int main(){    int n;    cin>>n;    for(int i=1;i<=n;++i)        for(int j=1;j<=n;++j)            cin>>mp[i][j];    bool flag=false;    for(int i=1;i<=n;++i){        for(int j=1;j<=n;++j){            if(mp[i][j]){                mp[j][i]=0;                mp[i][j]=0;                bfs(i,j,n);                flag=true;                break;            }        }        if(flag)            break;    }    print(n);    return 0;}

DFS

#include<bits/stdc++.h>using namespace std;const int maxn=110;int mp[maxn][maxn],cnt;void dfs(int x,int y,int n){    for(int i=1;i<=n;++i){        if(mp[i][y]){            mp[y][i]=0;            mp[i][y]=0;            cnt++;            dfs(i,y,n);        }        if(mp[x][i]){            mp[x][i]=0;            mp[i][x]=0;            cnt++;            dfs(x,i,n);        }    }}void print(int n){    for(int i=1;i<=n;++i){        for(int j=1;j<=n;++j)            cout<<mp[i][j]<<" ";        cout<<endl;    }}int main(){    int n;    cin>>n;    for(int i=1;i<=n;++i)        for(int j=1;j<=n;++j)            cin>>mp[i][j];    bool flag=false;    for(int i=1;i<=n;++i){        for(int j=1;j<=n;++j){            if(mp[i][j]){                cnt=1;                mp[j][i]=0;                mp[i][j]=0;                dfs(i,j,n);                flag=true;                break;            }        }        if(flag)            break;    }    cout<<cnt<<endl;    print(n);    return 0;}
阅读全文
0 0