60pts求助
查看原帖
60pts求助
452531
cygnus_beta楼主2021/7/9 16:53

代码如下:

#include<iostream>
using namespace std;

struct node{
    int fa,ls,rs,rank;
    explicit node(int _fa=0,int _ls=0,int _rs=0,int _rank=1):fa(_fa),ls(_ls),rs(_rs),rank(_rank){}
};

class tree{
private:
    int now_size,max_rank=-1;
    node* nodes;
public:
    explicit tree(const int& size):LCA(0),now_size(size+1),nodes(new node[size+1]){}

    ~tree(){delete[] nodes;}

    /*void dfs(const int& index,int rank=1){
        if(not index)return;
        max_rank=max(max_rank,rank);
        dfs(nodes[index].ls,rank+1);
        dfs(nodes[index].rs,rank+1);
    }*/

    void rank(const int& from,const int& to,const int& deep=1){
        if(from==to or not from)return;
        nodes[from].rank=deep;
        rank(nodes[from].ls,to,deep+1);
        rank(nodes[from].rs,to,deep+1);
    }

    node& operator[](const size_t& index){
        return nodes[index];
    }

    int width(){
        int cnt[max_rank+1];
        for(int i=0;i<max_rank+1;i++)cnt[i]=0;
        int max_width=0;
        for(int i=1;i<now_size;i++)cnt[nodes[i].rank]++;
        for(int i=1;i<max_rank+1;i++)max_width=max(max_width,cnt[i]);
        return max_width;
    }

    int depth()const{
        return max_rank;
    }

    int LCA;
    void lca(int u,int v){
        if(u==v){
            LCA=u;
            return;
        }
        if(nodes[u].rank>nodes[v].rank)
            for(int i=0;i<u-v;i++)u=nodes[u].fa;
        else if(nodes[v].rank>nodes[u].rank)
            for(int i=0;i<v-u;i++)v=nodes[v].fa;
        if(u==v){
            LCA=u;
            return;
        }
        lca(nodes[u].fa,nodes[v].fa);
    }

    int dis(int u,int v){
        lca(u,v);
        return (nodes[u].rank-nodes[LCA].rank)*2+nodes[v].rank-nodes[LCA].rank;
    }

    void ope(){
        for(int i=1;i<now_size;i++)max_rank=max(max_rank,nodes[i].rank);
    }
};

int n,u,v;

void input(tree& TREE){
    int fa,s,lfa=-1,ls=-1;
    for(int i=1;i<n;i++){
        cin>>fa>>s;
        if(lfa==fa)
            TREE[ls].fa=fa,
            TREE[s].fa=fa,
            TREE[fa].ls=ls,
            TREE[fa].rs=s;
        else
            TREE[s].fa=fa,
            TREE[fa].ls=s;
        lfa=fa;
        ls=s;
    }
}

int main(){
    cin>>n;
    tree Tree(n);
    input(Tree);
    cin>>u>>v;
    for(int i=2;i<=n;i++)Tree.rank(1,i);
    Tree.ope();
    //for(int i=1;i<=n;i++)cout<<i<<":"<<Tree[i].fa<<' '<<Tree[i].ls<<' '<<Tree[i].rs<<' '<<Tree[i].rank<<endl;
    cout<<Tree.depth()<<endl<<Tree.width()<<endl<<Tree.dis(u,v);

    return 0;
}
2021/7/9 16:53
加载中...