BFS ,DFS之前都接触过,但是很少放到图里去用。
集训讲了讲,做了几道题,怕忘了写个这个
1.图的遍历——深度优先搜索
大意:
给一个图的邻接矩阵,从0开始深搜这个图。
定义标记数组,在每次dfs后把已访问的点标记,不再去访问,函数像递归一样写就行了
#include<bits/stdc++.h>
using namespace std;
int a[55][55],vis[55],n;//vis标记数组
void dfs(int k){
vis[k]=1;//打标
cout<<k<<' ';
for(int i=0;i<n;i++){
if(a[k][i]>0&&vis[i]==0){//若联通且未被访问
dfs(i);
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
if(vis[i]==0)dfs(i);
}
return 0;
}
2.图的遍历——广度优先算法
大意:
给一个图的邻接矩阵,从0开始广搜这个图。
和DFS一样吧,但是不用函数,用队列实现
#include<bits/stdc++.h>
using namespace std;
queue<int>q;//队列实现
int a[105][105],vis[105];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
q.push(0);
while(!q.empty()){
cout<<q.front()<<' ';
int x=q.front();
q.pop();
vis[x]=1;
for(int i=0;i<n;i++){
if(a[i][x]==1&&vis[i]==0){
q.push(i);
vis[i]=1;
}
}
}
return 0;
}