DFS:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
typedef double db;
vector<int> a[10];
int n,m;
bool vis[12];
void dfs(int now){
vis[now]=1;
for(auto to:a[now]){
if(!vis[to]){
dfs(to);
}
}
return ;
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
dfs(1);
for(int i=1;i<=n;i++){
printf("%d ",vis[i]);
}
system("pause");
return 0;
}
BFS:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
typedef double db;
vector<int> a[10];
int n,m;
bool vis[12];
queue<int> q;
void bfs(int st){
q.push(st);
vis[st]=1;
while(!q.empty()){
int now=q.front(); q.pop();
for(auto to:a[now]){
if(!vis[to])
q.push(to);
vis[to]=1;
}
}
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
bfs(1);
for(int i=1;i<=n;i++){
printf("%d ",vis[i]);
}
system("pause");
return 0;
}
BFS 中 起点到其点的最小距离
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
typedef double db;
vector<int> a[10];
int n,m;
bool vis[12];
int dis[12];
queue<int> q;
void bfs(int st){
q.push(st);
memset(dis,0x3f,sizeof(dis));
dis[st]=0;
vis[st]=1;
while(!q.empty()){
int now=q.front(); q.pop();
for(auto to:a[now]){
if(!vis[to]){
dis[to]=min(dis[to],dis[now]+1);
q.push(to);
vis[to]=1;
}
}
}
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
bfs(1);
for(int i=1;i<=n;i++){
printf("%d ",vis[i]);
}
cout<<endl;
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
system("pause");
return 0;
}
拓展知识:
一棵树的重心就是子树最大节点数最小,
树的直径,就是两次BFS求得的最大值