森林/树的不同遍历方式

起源:像一般做图论时的方式用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;
}

猜你喜欢

转载自www.cnblogs.com/Gsimt/p/10163690.html
今日推荐