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;
}
}