⭐
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/508c8c8fcc83fc54894c553384bfcae7.jpeg)
树与图的深度优先遍历
树的DFS序、深度、重心
连通块的划分
bool vis[N];
ll bel[N], nex[N], head[N], to[N], val[N];
ll cnt, n;
void dfs(int x)//访问x能到达的所有的点和边
{
bel[x] = cnt;//bel【belong】数组标记了x属于哪一个连通块
for (int i = head[x]; i; i = nex[i])
{
int y = to[i], z = val[i];
if (bel[y])
continue;
dfs(y);
}
}
int main()
{
// IOS;
for (int i = 1; i <= n; i++)
{
if (!bel[i])
{
cnt++;
dfs(i);
}
}
return 0;
}
树与图的广度优先遍历
拓扑排序
记得每次要先初始化入度++【x->y,x在集合A中都出现在y之前】
queue<int> q;
inline void topo() //邻接矩阵存图的拓扑排序
{
for (int i = 1; i <= n; i++)
{
if (!deg[i])//deg数组表示入度
q.push(i);
}
while (q.size())
{
int x = q.front();
q.pop();
for (int i = 1; i <= n; i++)
{
if (e[x][i])
{
deg[i]--;
if (!deg[i])
q.push(i);
}
}
}
}