版权声明:未经过作者允许,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()
{
}