/*==============================================================*//*程序:freetree.c*//*目的:生成所有空闲树*//*input:n——节点数*//*m——最大度数*//*lb,ub——直径的下限和上限*//*输出:按relex顺序列出空闲树*//*日期:1995年9月,2000年9月更新*//*程序员:Gang Li和Frank Ruskey*//*算法:来自论文:G.Li和F.Ruskey,“*//*前瞻性思维在生成根深蒂固和*//*自由树”,第十届ACM-SIAM离散型研讨会*//*算法(SODA),(1999)S939-940。请参阅网页*//*http://www.theory.csc.UVic.CA网站/~fruskey/*//*出版物/RootedFreeTree.html*//*更多信息:请参阅*//* http://www.theory.csc.UVic.CA/inf/FreeTrees.html *//*==============================================================*/#包括#包括使用命名空间标准;#定义树的MAX_SIZE 50/*最大大小*/#定义TRUE 1#定义FALSE 0整数par[MAX_SIZE],/*i的父位置*/L[MAX_SIZE],/*节点i的级别*/k、 /*儿童的最大数量*/chi[MAX_SIZE],/*节点的子节点数*/nextp[MAX_SIZE],/*下一个添加节点的好位置*/rChi[MAX_SIZE],/*节点i最右边的子节点*/ub;/*上限*/无符号__int64 num;/*树木数量*/整数N;/*对应于-n*/整型K;/*-k个*/整数M;/*-米*/整型U;/*-单位*/const unsigned int maxN=30;//W.Bomfim添加的代码const unsigned int minN=3;无符号__int64 an;//a(n)无符号整数Grau[maxN+1],//Grau[i],1<=i<=N,是i的次数。maxL,//数组L的最大值。顶部,P[最大N];//原始树叶堆叠布尔居中;//如果树居中,则为true。void居中(无符号int u){静态无符号整数i,v,L;对于(i=0;i最大L){居中=真;回报;}}居中=假;}无符号int Wiener_index(){静态无符号int W,u,v,i,cGrau[maxN+1],Q[最大值],F,R,订单[maxN+1];F=R=0;W=0;顶部=0;对于(u=1;u<=N;u++){阶数[u]=1;if(重力[u]==1){Q[R]=u;R++;P[top]=u;顶部++;}否则cGrau[u]=Grau[u];}对于(i=1;i最大L)最大L=L[u];}无效inicialize(){a=0;查找Grau_maxL();}无效打印(){无符号整数I;数字++;如果(num==1)inicialize();I=Wiener_index();if(!居中)a+=I;}//W.Bomfim添加的代码末尾无效更新L(){整数i;L[1]=0;最大L=0;对于(i=2;i<=N;++i){L[i]=L[par[i]]+1;如果(L[i>maxL)maxL=L[i];}}int良好(int p,int h,int t){如果(p==2&&K<=2&&t==0)返回TRUE;如果(t==1){如果(2*h>=K+1&&2*h<=U+1){如果((p-1)*2>=N)返回TRUE;否则,如果(p-h-1==1){如果(par[p]>2)返回TRUE;}其他如果((p-h-1>=2)&&((par[h+2]>2)||(par[h+3]>2)))返回TRUE;}}其他如果(N-p>=h&&2*h>=K){如果(U==N-1&&N%2==0)返回(2*h<=U+1);否则返回(2*h<=U);}返回FALSE;}/*良好*/void Gen(int p,int s,int cL,int h,int l,int n,int f,int g){int hh,flag,entry,temp;//添加了修改数组Grau的说明W.Bomfim公司如果(p>n)如果(f==0){if(良好(p-1,h,0))Gen(p,2,p-2,h,n,n,1,0);if(良好(p-1,h,1))Gen(p,2,p-3,h,n,n,1,1);}else{updateL();PrintIt();}其他{如果(cL==0){如果(p<ub+2){格拉[par[p]]--;par[p]=p-1;格拉[p-1]++;}其他{生成(p,p-1,1,h,l,n,f,g);回报;}}其他如果(par[p-cL]<s){Grau[par[p]]--;par[p]=par[p-cL];Grau[par[p]]++;}其他{Grau[par[p]]--;par[p]=cL+par[p-cL];Grau[par[p]]++;如果(g==1)如果(((l-1)*2<n)&&(p-cL<=l)&&(((p-cL+1)l) ){/*情况3*/s=par【p】;cL=p-s;格劳[par[p]]-;par[p]=par[par[p]];Grau[par[p]]++;}其他如果(par[p-cL]==2){格拉乌[par[p]]--;par[p]=1;格拉乌[1]++;}}如果(s!=0|p<=ub+1){chi[par[p]]=chi[par[p]]+1;温度=rChi[par[p]];rChi[par[p]]=p;如果(chi[par[p]]<=((par[p]==1)?k: k-1)){如果(chi[par[p]]<(par[p]==1?k:k-1))nextp[p]=par[p';否则nextp[p]=下一个[par[p]];生成(p+1,s,cL,h,l,n,f,g);}chi[par[p]]=chi[par[p]]-1;rChi[par[p]]=温度;}如果(s==0&&2*(p-2)=2)) ||((f==1)&(条目>=1))&(标志==0)){如果(s==0)h=p-2;如果(p<=l+h-g)hh=0;如果(f==0){/*s=par【p】;par[p]=par[s]*/Grau[par[p]]--;par[p]=条目;Grau[entry]++;chi[entry]=chi[entry]+1;温度=rChi[par[p]];rChi〔par〔p〕〕=p;如果(chi[entry]>=(entry==1?k:k-1))nextp[p]=nextp[entry];如果(f==0)Gen(p+1,temp,p-temp,h,0,N-h+1,f,g);否则,如果(hh==1)Gen(p+1,temp,p-temp,h,l,n,f,g);chi[entry]=chi[entry]-1;rChi[par[p]]=温度;entry=nextp[entry];nextp[p]=条目;}else标志=1;}如果(f==0){如果(良好(p-1,h,0))Gen(p,2,p-2,h,p-1,N,1,0);if(良好(p-1,h,1))Gen(p,2,p-3,h,p-1,N,1,1);}}}/*发电机*/main(){//由W.Bomfim修改的代码整数i;K=2;par[1]=0;par[2]=1;printf(“以a(%d)开头\n”,minN);对于(N=最小N;N<=最大N;N++){num=0;M=N-1;U=N-1;ub=(U+1)/2;k=M;对于(i=1;i<=N;i++)chi[i]=0;下一个p[1]=0;nextp[2]=1;chi[1]=1;生成(3,0,0,ub,0,N-ub+1,0,0);cout<<an<<“,”;}返回(0);}