图之邻接矩阵,深度遍历,广度遍历,连通分量个数

 

1.深度遍历 DFS

类似于树的先根遍历

《图之邻接矩阵,深度遍历,广度遍历,连通分量个数》

如图,上述图的深度遍历输出为ADCBE

给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始

 

class Graph 
{ 
private:
    int flag[N];//状态数组
    int Vexnum;//图的顶点数量
    int Matrix[N][N];  //邻接矩阵
    void DFS(int v);
public: 
    Graph() 
    { 
        for(int i=0;i<N;i++)
            flag[i]=0;
    } 
    void DFStra();
    void SetMatrix(int n,int p[N][N]);
}
void Graph::SetMatrix(int n,int p[N][N])//设置邻接矩阵
{
    Vexnum=n;
    for(int i=0;i<Vexnum;i++)
        for(int j=0;j<Vexnum;j++)
        {
            Matrix[i][j]=p[i][j];   
        }
}
void Graph::DFStra()
{
    int i;
    for(i=0;i<Vexnum;i++)//可能有多个连通图
    {
        if(flag[i]==0)//找到一个状态为0的顶点
            DFS(i);
    }
    cout<<endl;
}
 
void Graph::DFS(int v)
{
    int w,i,k;
    flag[v]=1;//把这个顶点的状态设置为1
    cout<<v<<" ";
    int temp[N];
    for(i=0;i<Vexnum;i++)
        temp[i]=0;
    k=0;
    for(i=0;i<Vexnum;i++)找到与当前这个顶点有连接的顶点,并存入temp数组中
    {
        if(Matrix[v][i]==1)
            temp[k++]=i;
    }
    i=0;
    for(i=0;i<k;i++)//对这个几个顶点递归遍历
    {
        w=temp[i];
        if(flag[w]==0)
            DFS(w);
    }
     
}
int main() 
{ 
    int t,i,num,j; 
    int x[N][N];
    int n; 
    cin>>t; 
    while(t--) 
    { 
        cin>>n;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                cin>>x[i][j];
        Graph p;
        p.SetMatrix(n,x);
        p.DFStra();
    } 
}

测试的数据为:

样例输入

2

4

0 0 1 1

0 0 1 1

1 1 0 1

1 1 1 0

5

0 0 0 1 1

0 0 1 0 0

0 1 0 1 1

1 0 1 0 0

1 0 1 0 0

样例输出

0 2 1 3

0 3 2 1 4

 

2.广度遍历BFS 及 计算连通分量个数

广度遍历类似于树的层次遍历

例如:一个连接矩阵如下

0 1 1 0 0 0 0 0

1 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1

0 0 0 0 0 1 1 0

0 0 0 0 1 0 0 0

0 0 0 0 1 0 0 0

0 0 0 1 0 0 0 0

该矩阵的图示如下

《图之邻接矩阵,深度遍历,广度遍历,连通分量个数》

可知连通分量为3,通过广度遍历输出的结果为ABCDIEFH

 

#include<bits/stdc++.h> 
using namespace std ; 
#define N 20
class Graph 
{ 
private:
    int flag[N];
    int num;//连通分量个数
    int Vexnum;
    string temp[N];
    int Matrix[N][N];  //边数组 
    void BFS(int v);
public: 
void BFStra() ;

    Graph(string x[],int n) {
        int i;
		num=0;
        Vexnum=n;
        for(i=0;i<Vexnum;i++)
            temp[i]=x[i];
        for(int i=0;i<N;i++)
            flag[i]=0;
        for(int i=0;i<Vexnum;i++)
            for(int j=0;j<Vexnum;j++)
            {
                Matrix[i][j]=0; 
            }
    } 
    int find(string x);
    void SetMatrix();
    void display();
    void GetNum();
}; 
void Graph::SetMatrix()//对邻接矩阵初始化
{
    int i,k,j,x,y,h;
    string a,b;
    cin>>k;
    i=0;
    while(k--)
    {
        cin>>a>>b;
        x=find(a);
        y=find(b);
        Matrix[x][y]=1;
        Matrix[y][x]=1;
    }
}
void Graph::BFStra()
{
    int i=0;
    for(i=0;i<Vexnum;i++)
        if(flag[i]==0)
        {
            BFS(i);
            }   
}
void Graph::BFS(int v)
{
    int w,u;
    int i,k;
    int temp[N];
    queue<int> p;
    k=0;
    for(i=0;i<Vexnum;i++)
        flag[i]=0;
    for(v=0;v<Vexnum;v++)
    {
         
        if(flag[v]==0)
        {   num++;
            flag[v]=1;
            cout<<v<<" ";
            p.push(v);  //把找到满足要求的顶点放入队列中
            while(!p.empty())
            {   
                k=0;
                u=p.front();
                if(flag[u]==0)
                {
                    cout<<u<<" ";
                    flag[u]=1;
                }
                p.pop();
                for(i=0;i<Vexnum;i++)//查找与当前顶点连接的顶点
                {
                    if(Matrix[u][i]==1&&flag[i]==0)
                    {
                        p.push(i);
                    }
                }
                 
            }
        }
    }
    cout<<endl;
 
}
int Graph::find(string x)
{
    for(int i=0;i<Vexnum;i++)
        if(x==temp[i])
            return i;
}
void Graph::display()
{
    int i,j;
    for(i=0;i<Vexnum;i++)
    {
        if(i!=0)
            cout<<" ";
        cout<<temp[i];
    }
    cout<<endl;
    for(i=0;i<Vexnum;i++)
    {
        for(j=0;j<Vexnum;j++)
        {
            if(j!=0)
                cout<<" ";
            cout<<Matrix[i][j];
             
        }
        cout<<endl;
    }
    cout<<num<<endl;
}
int main()
{
    int t,i,j; 
    string x[N];
    int n; 
    cin>>t; 
    while(t--) 
    { 
        cin>>n;
        for(i=0;i<n;i++)
            cin>>x[i];
        Graph p(x,n);
        p.SetMatrix();
        cout<<"广度遍历结果:" <<endl;
        
        p.BFStra(); 
		cout<<endl;
        p.display();
        cout<<endl;
    } 
}

 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/forTiffanyY/article/details/83713553
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞