基本遍歷:code
//dfs void dfs(int x) { v[x]=1; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; dfs(y); } } //bfs void bfs(int x) { queue<int>q; q.push(x);v[x]=1; while(q.size()) { int u=q.front();q.pop(); for(int i=head[u];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; v[y]=1; q.push(y); } } }
dfs求樹和圖的信息排序
//dfs時間戳 void dfs(int x) { dfn[x]=++cnt; v[x]=1; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; dfs(y); } } //dfs序 void dfs(int x) { dfsx[++cnt]=x; v[x]=1; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; dfs(y); } dfsx[++cnt]=x; } //樹的深度 void dfs(int x) { v[x]=1; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; deep[y]=deep[x]+1; dfs(y); } } //子樹大小+樹的重心 void dfs(int x) { size[x]=v[x]=1; int max_part=0; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; dfs(y); size[x]+=size[y]; max_part=max(max_part,size[y]); } max_part=max(max_part,n-size[x]); if(max_part<ans) { ans=max_part; pos=x; } } //圖的連通塊劃分 void dfs(int x) { v[x]=cnt; for(int i=head[x];i;i=next[i]) { int y=ver[i]; if(v[y]) continue; dfs(y); } } for(int i=1;i<=n;++i) if(!v[i]) { ++cnt; dfs(i); }
bfs求樹和圖的信息ci
//拓撲排序 void topsort() { queue<int>q; for(int i=1;i<=n;++i) if(deg[i]==0) q.push(i); while(q.size()) { int x=q.front();q.pop(); a[++cnt]=x; for(int i=head[x];i;i=next[i]) if(--deg[ver[i]]==0) q.push(ver[i]); } } int main() { cin>>n>>m; for(int i=1;i<=m;++i) { int x,y; scanf("%d%d",&x,&y); add(x,y); } topsort(); for(int i=1;i<=cnt;++i) printf("%d ",a[i]); return 0; }