1.图的深度优先遍历
void dfs(int x)
{
v[x]=1;
for(int i=h[x];i;i=ne[i]){
int y=ver[i];
if(v[y]) continue;
dfs(y);
}
}
2.树的dfs序。
void dfs(int x)
{
a[++m]=x;
v[x]=1;
for(int i=h[x];i;i=ne[i]){
int j=ver[i];
if(v[j]) continue;
dfs(j);
}
a[++m]=x;
}
3.树的深度。
void dfs(int x)
{
v[x]=1;
for(int i=h[x];i;i=ne[i]){
int j=ver[i];
if(v[j]) continue;
d[j]=d[x]+1;
dfs(j);
}
}
4.树的重心
void dfs(int u)
{
v[u]=sz[u]=1;
int mx=0;
for(int i=h[u];i;i=ne[i]){
int j=ver[i];
if(v[j]) continue;
dfs(j);
sz[u]+=sz[j];
mx=max(mx,sz[j]);
}
mx=max(mx,n-sz[u]);
if(mx<ans){
ans=mx;
pos=u;
}
}
5.bfs
void bfs()
{
MEM(d,0);
queue<int>q;
q.push(1),d[1]=1;
while(q.size()>0){
int x=q.front();
q.pop();
for(int i=h[x];i;i=ne[i]){
int y=ver[i];
if(d[y]) continue;
d[y]=d[x]+1;
q.push(y);
}
}
}
6.拓扑排序
void add(int x,int y)
{
ver[++tot]=y,ne[tot]=h[x],h[x]=tot;
++d[y];
}
void topsort()
{
queue<int>q;
rep(i,1,n+1) if(!d[i]) q.pop(i);
while(q.size()){
int x=q.front();
q.pop();
a[++cnt]=x;
for(int i=h[x];i;i=ne[i]){
int y=ver[i];
if(--d[y]==0) q.push(y);
}
}
}