1. 程式人生 > >森林/樹的不同遍歷方式

森林/樹的不同遍歷方式

起源:像一般做圖論時的方式用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; }