DFS遍历图
深度优先搜索以“深度”为主,每次都是沿着路径不能再前进时才退回到最近的岔路口。
模板(注释):
const int maxx=1000; //最大顶点数
const int inf =1e9; //无连通的边
int n,g[maxx][maxx];
bool vis[maxx]={false}; //记录该点是否被访问
void DFS(int u,int depth) //u为当前点,depth为深搜的深度
{
vis[u]=true;
for(int v=0;v<n;v++)
{
if(vis[v]==false&&g[u][v]!=inf)
{
DFS(v,depth+1);
}
}
}
void trval() //遍历图
{
for(int u=0;u<n;u++)
{
if(vis[u]==false)
DFS(u,1); //从U开始访问,记录为第一层
}
}
BFS遍历图
广度优先搜索以“广度”为主,每次以扩散的方式向外访问顶点。
模版(注释):
const int maxx=1000; //最大顶点数
const int inf =1e9; //无连通的边
int n,g[maxx][maxx];
bool inq[maxx]={false}; //记录该点是否入过队
void BFS(int u) //遍历u所在的连通块
{
queue<int>q;
q.push(u);
inq[u]=true; //标记入过队
while(!q.empty()) //只要队列非空
{
int u=q.front(); //取出队首元素
q.pop(); //将队首元素出队
for(int v=0;v<n;v++)
{
if(inq[v]==false&&g[u][v]!=inf) //如果u的邻接点未曾入过队
{
q.push(v); //将v入队
inq[v]=true; //标记
}
}
}
}
void trval()
{
for(int u=0;u<n;u++)
{
if(inq[u]==false)//如果未曾入队
{
BFS(q);
}
}
}