森林/樹的不同遍歷方式
阿新 • • 發佈:2018-12-23
起源:像一般做圖論時的方式用vector存圖然後MLE了(比賽的時候還不知道怎麼改。。。)
分類:自根向下訪問,自底向上訪問,某未知訪問方式
自根向下:
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<map> #define INF 0x7f7f7f7f #defineMAX_INT 0x7fffffff #define _for(i,a,b) for(int i=(a);i<(b);i++) #define __for(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; typedef long long LL; typedef unsigned int uint; typedef pair<int,int> pa; const int N=1e6+5; int to[N],nxt[N],cnt[N],md; vector<int>root; void dfs(intnod,int dep){ md=max(md,dep); cnt[dep]++; if(nxt[nod])dfs(nxt[nod],dep); if(to[nod])dfs(to[nod],dep+1); return; } int main(){ int n,a,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a); nxt[i]=to[a]; if(a)to[a]=i;else{ root.push_back(i); } } for(int i=0;i<root.size();i++){ dfs(root[i],1); for(int j=1;j<=md;j++){ if(cnt[j]%2)ans++; cnt[j]=0; } printf("%d "ans); md=0,ans=0; } return 0; }