- BC20270041's blog
图论DFS、BFS模板
- 2024-12-16 22:54:21 @
DFS
#include <bits/stdc++.h>
using namespace std;
//结点的个数不能多于100
vector <int> g[123];//邻接表:从0下标开始,每一个一维表示连接了哪些结点
//vector中,[123]去掉才表示一维数组
bool vis[123];//该节点是否被访问
void dfs(int x){
//1、表示该节点已经走过
vis[x]=true;
cout<<x<<' ';//表示访问当前节点
//2、从小到大访问有关系的结点,往下递归
//不用for,用增强for循环,只能查询,不能修改
for(int v:g[x]){
if(!vis[v]){
dfs(v);
}
}
return ;
}
int main(){
int n,m;//n个结点,m种关系
cin>>n>>m;
int u,v;//从u到v
for(int i=1;i<=m;i++){
cin>>u>>v;
//u连接v的动态数组
g[u].push_back(v);
}
for(int i=0;i<n;i++){
if(!vis[i]);//没有访问才进入深搜
dfs(i);//从第i个结点开始
cout<<endl;
}
return 0;
}
BFS
//题目传送门:https://oj.aicoders.cn/problem/3273
#include <bits/stdc++.h>
using namespace std;
int n,m,a,b,goal;
struct node{
int num;
int step;
//将此字符串与下一个节点拼接
string ans;
};
int Map[56][56];
bool vis[56];
queue<node> q;
void bfs(){
while(!q.empty()){
node fr=q.front();
q.pop();
if(fr.step<=5&&fr.num==goal){
cout<<"YES"<<endl;
cout<<fr.ans<<goal;
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]&&Map[fr.num][i]){
string s1;
vis[i]=true;
s1=fr.ans+to_string(fr.num)+" ";
q.push({i,fr.step+1,s1});
}
}
}
cout<<"NO";
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
Map[a][b]=1;
Map[b][a]=1;
}
cin>>goal;
q.push({1,0,""});
bfs();
return 0;
}
看U盘!(紫)