欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

邻接矩阵:深度优先遍历和广度优先遍历

程序员文章站 2022-06-13 11:45:43
...

和邻接表一样,依葫芦画瓢。

#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 100

int v[MAXSIZE];
int m[MAXSIZE][MAXSIZE];
int n,e;

void Init()
{
    int a,b;
    for(int i=1;i<=MAXSIZE;i++)
        for(int j=1;j<=MAXSIZE;j++)
            m[i][j]=0;
    cin>>n>>e;
    for(int i=0;i<e;i++)
    {
        cin>>a>>b;
        m[a][b]=m[b][a]=1;
    }
}

int FirstAdjVex(int k)
{
    for(int i=1;i<=n;i++)
        if(!v[i]&&m[k][i])
            return i;
    return -1;
}

int NextAdjVex(int k,int w)
{
    for(int i=1;i<=n;i++)
        if(!v[i]&&m[k][i]&&i!=w)
            return i;
    return -1;
}

void DFS(int k)
{
    v[k]=1;
    cout<<k<<" ";
    for(int w=FirstAdjVex(k);w!=-1;w=NextAdjVex(k,w))
        if(!v[w])
            DFS(w);
}

void DFSTraverse()
{
    memset(v,0,sizeof(0));
    for(int i=1;i<=n;i++)
        if(!v[i])
            DFS(i);
}

void BFS()
{
    queue<int> q;
    int k;
    memset(v,0,sizeof(v));
    for(int i=1;i<=n;i++)
        if(!v[i])
        {
            v[i]=1;
            cout<<i<<" ";
            q.push(i);
            while(!q.empty())
            {
                k=q.front();
                q.pop();
                for(int w=FirstAdjVex(k);w!=-1;w=NextAdjVex(k,w))
                    if(!v[w])
                    {
                        v[w]=1;
                        cout<<w<<" ";
                        q.push(w);
                    }
            }
        }
}

int main()
{
    Init();
    cout<<"DFS:";
    DFSTraverse();
    cout<<endl;
    cout<<"BFS:";
    BFS();
}

邻接矩阵:深度优先遍历和广度优先遍历

邻接矩阵:深度优先遍历和广度优先遍历