起源:像一般做图论时的方式用vector存图然后MLE了(比赛的时候还不知道怎么改。。。)
分类:自根向下访问,自底向上访问,某未知访问方式
自根向下:
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<map> #define INF 0x7f7f7f7f #define MAX_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(int nod,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; }