#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 1000;
int a[maxn];
bool inqueue[maxn] = {false};//记录广搜时结点是否入队
bool visit[maxn] = {false};//记录深搜时结点是否已被访问
int G1[maxn][maxn] = {0};//邻接矩阵
vector<int> G2[maxn];//邻接表
int n;//结点个数
首先深搜,用邻接矩阵存储和邻接表存储有一些不同之处
//深度优先,邻接矩阵存储
void DFS1(int root){
visit[root] = true;
//对结点的操作
for(int i= 0;i < n;i ++){
if(visit[i] == false && G1[root][i] > 0){//结点未被访问,且存在此条边
DFS1(i);
}
}
}
void DFSTravel1(){
for(int i = 0;i < n;i ++){
if(visit[i] == false){
DFS1(i);
}
}
}
//深度优先,邻接表存储
void DFS2(int root){
visit[root] = true;
for(int i = 0;i < G2[root].size();i ++){
if(visit[G2[root][i]] == false){
DFS2(G2[root][i]);
}
}
}
void DFSTravel2(){
for(int i = 0;i < n;i ++){
if(visit[i] == false){
DFS2(i);
}
}
}
广搜
//广度优先,邻接矩阵存储
void BFS1(int root){
queue<int> q;
q.push(root);
inqueue[root] = true;
//对结点的操作
while(!q.empty()){
int temp = q.front();
for(int i = 0;i < n;i ++){
if(inqueue[i] == false && G1[temp][i] > 0){//结点未被访问,且存在此条边
q.push(i);
inqueue[i] = true;
}
}
q.pop();//所有下一层节点入队后,队首结点出队
}
}
void BFS1Travel(){
for(int i = 0;i < n;i ++){
if(inqueue[i] == false){
BFS1(i);
}
}
}
//广度优先,邻接表存储
void BFS2(int root){
queue<int> q;
q.push(root);
inqueue[root] = true;
//对结点的操作
while(!q.empty()){
int temp = q.front();
for(int i = 0;i < G2[temp].size();i ++){
if(inqueue[G2[temp][i]] == false){//由于是邻接表存储,这条边必定存在,只需判定是否访问过即可
q.push(G2[temp][i]);
inqueue[G2[temp][i]] = true;
}
q.pop();//所有下一层节点入队后,队首结点出队
}
}
}
void BFSTravel2(){
for(int i = 0;i < n;i ++){
if(inqueue[i] == false){
BFS2(i);
}
}
}