【原创】模板-树的前中后序遍历,树的重心直径

版权声明:未经过作者允许,QωQ是可以转载的,只不过要赞一下本文章并发评论告诉我,然后转载附上原网址就好了!=QωQ= https://blog.csdn.net/c20182030/article/details/78370838

天天高高兴兴打模板

#include<ctime>
#include<cstdio>
#include<vector>
#include<cstdlib>
using namespace std;
const int MAXN=12345;

//二叉树前中后序遍历
int L[MAXN],R[MAXN],up[MAXN];

void XXBL(int i)
{
    printf("%d\n",i);
    if(L[i]) XXBL(L[i]);
    if(R[i]) XXBL(R[i]);
}

void ZXBL(int i)
{
    if(L[i]) ZXBL(L[i]);
    printf("%d\n",i);
    if(R[i]) ZXBL(R[i]);
}

void HXBL(int i)
{
    if(L[i]) HXBL(L[i]);
    if(R[i]) HXBL(R[i]);
    printf("%d\n",i);
}

//重心:最大子树节点数最少的点

int N;
struct mypair
{
    int to,val;
    mypair(){};
    mypair(int a,int b){to=a,val=b;}
}h;
vector <mypair> down[MAXN];

void addedge(int u,int v,int w)
{
    down[u].push_back(mypair(v,w));
}

void add(int u,int v,int w)
{
    addedge(u,v,w);
    addedge(v,u,w);
}

bool vis[MAXN];
int son[MAXN],pos,siz=2147483647;

void dfs_zx(int crl)
{
    vis[crl]=1,son[crl]=0;
    int h=-1;
    for(unsigned int i=0;i<down[crl].size();i++)
    {
        int v=down[crl][i].to;
        if(!vis[v])
        {
            dfs_zx(v);
            son[crl]+=son[v]+1;
            h=max(h,son[v]+1);
        }
    }
    h=max(h,N-son[crl]-1);
    if(h<siz||(h==siz&&crl<pos))
        siz=h,pos=crl;
}//pos即为所求

//直径:最长链
int num[MAXN],ans,cal;    
void dfs(int crl,int crr)    
{    
    for(unsigned int i=0;i<down[crl].size();i++)
    {
        int v=down[crl][i].to,w=down[crl][i].val;
        if(v!=crr)
        {
            num[v]=num[crl]+w;
            if(num[v]>cal) cal=num[v],ans=v;
            dfs(v,crl);
        }
    }
}   

int nxt[MAXN];

void dfs1(int crl,int crr)    
{    
    for(unsigned int i=0;i<down[crl].size();i++)
    {
        int v=down[crl][i].to,w=down[crl][i].val;
        if(v!=crr)
        {
            num[v]=num[crl]+w,nxt[v]=crl;
            if(num[v]>cal) cal=num[v],ans=v;
            dfs1(v,crl);
        }
    }
}//ans即为所求,nxt记录路径


int main()
{

}

猜你喜欢

转载自blog.csdn.net/c20182030/article/details/78370838