/* gentree version 1.3; Brendan McKay Oct 2022 */ /* This program is a wrapper for the program FreeTrees.c written *byGangLi&FrankRuskey.Seebelowfortheiroriginal
* comments. */ /* TODO: splitlevinc */
#define HELPTEXT \ " Generate (unrooted) trees.\n\
\n\
n, n1:n2 : the number of vertices or a range\n\
Outputs are in order of the number of vertices.\n\
res/mod : only generate subset res out of subsets 0..mod-1\n\
\n\
-D# : an upper bound for the maximum degree\n\
-Z#:# : bounds for the diameter\n\
\n\
-s : use sparse6 output (default)\n\
-p : write a parent array\n\
-l : write a level array \n\
-u : donot output any graphs, just generate and count them\n\
\n\
-q : suppress auxiliary output\n\
\n\
See program text for much more information.\n"
/* Comments on original program by original authors */ /*==============================================================*/ /* program: freetree.c */ /* purpose: generating all free trees */ /* input : n -- number of nodes */ /* m -- max degree */ /* lb,ub -- lower and upper bound on diameter */ /* res/mod -- splitting into parts */ /* output : listing of free trees in relex order */ /* date : September 1995, updated Sept 2000 */ /* programmers: Gang Li & Frank Ruskey */ /* algorithm: From the paper: G. Li and F. Ruskey, "The */ /* Advantages of Forward Thinking in Generating Rooted and */ /* Free Trees", 10th Annual ACM-SIAM Symposium on Discrete */ /* Algorithms (SODA), (1999) S939-940. See the web page at */ /* http://www.theory.csc.UVic.CA/~fruskey/ */ /* Publications/RootedFreeTree.html */ /* more info: See */ /* http://www.theory.csc.UVic.CA/~cos/inf/FreeTrees.html */ /*==============================================================*/
#define MAXN 128/* max size of the tree.
Check MAXOUTLEN if more than 1000 */ #include"gtools.h"
staticint
par[MAXN+1], /* parent position of i */
maxchild, /* max number of children */
chi[MAXN+1], /* number of children of a node */
nextp[MAXN+1], /* next good pos to add nodes */
rChi[MAXN+1], /* the right most child of node i */
ub; /* upper bound on something */
static nauty_counter nout; /* number of trees */ static FILE *outfile;
staticint nv; /* number of vertices */ staticint mindiam; staticint maxdeg; staticint maxdiam;
/* MAXOUTLEN must be at least the longest output line length */ #define MAXOUTLEN (10 + 4*MAXN) staticchar outstring[MAXOUTLEN];
void (*outproc)(FILE *f, int vpar[], int n); #ifdef OUTPROC externvoid OUTPROC(FILE *f, int vpar[], int n); #endif #ifdef PRUNE externint PRUNE(int vpar[], int n); #endif
void WritePar(FILE *f, int vpar[], int n) /* Write parent array */
{ int i,j; char *pout,*p,one[8];
size_t len;
pout = outstring;
for (i=1;i<=nv;++i) {
j = vpar[i]; if (j == 0) *(pout++) = '0'; else { for (p = one; j > 0; j /= 10)
*(p++) = '0' + j%10; while (--p >= one) *(pout++) = *p;
} if (i < nv) *(pout++) = ' '; else *(pout++) = '\n';
}
len = pout - outstring;
if (fwrite(outstring,sizeof(char),len,f) != len)
gt_abort(">E gentreeg: fwrite() failed\n");
}
staticvoid
WriteLev(FILE *f, int vpar[], int n) /* Write levels array */
{ int i,j; char *pout,*p,one[8];
size_t len; int lev[MAXN+1];
lev[1]=0; for ( i=2; i<=nv; ++i ) lev[i] = lev[vpar[i]]+1;
pout = outstring;
for (i=1;i<=nv;++i) {
j = lev[i]; if (j == 0) *(pout++) = '0'; else { for (p = one; j > 0; j /= 10)
*(p++) = '0' + j%10; while (--p >= one) *(pout++) = *p;
} if (i < nv) *(pout++) = ' '; else *(pout++) = '\n';
}
len = pout - outstring;
if (fwrite(outstring,sizeof(char),len,f) != len)
gt_abort(">E gentreeg: fwrite() failed\n");
}
staticvoid
DontWrite(FILE *f, int vpar[], int n) /* Null print routine */
{
}
staticvoid
WriteS6(FILE *f, int vpar[], int n) /* Write in sparse6 format */
{ char *pout; int nb,i,j,lastj,x,k,r,rr,topbit;
size_t len;
pout = outstring;
*pout++ = ':';
encodegraphsize(n,&pout);
for (i = n-1, nb = 0; i != 0 ; i >>= 1, ++nb) {}
topbit = 1 << (nb-1);
k = 6;
x = 0;
lastj = 0; for (j = 1; j < n; ++j)
{
i = vpar[j+1] - 1; if (j == lastj)
{
x <<= 1; if (--k == 0)
{
*pout++ = 63 + x;
k = 6;
x = 0;
}
} else
{
x = (x << 1) | 1; if (--k == 0)
{
*pout++ = 63 + x;
k = 6;
x = 0;
} if (j > lastj+1)
{ for (r = 0, rr = j; r < nb; ++r, rr <<= 1)
{ if (rr & topbit) x = (x << 1) | 1; else x <<= 1; if (--k == 0)
{
*pout++ = 63 + x;
k = 6;
x = 0;
}
}
x <<= 1; if (--k == 0)
{
*pout++ = 63 + x;
k = 6;
x = 0;
}
}
lastj = j;
} for (r = 0, rr = i; r < nb; ++r, rr <<= 1)
{ if (rr & topbit) x = (x << 1) | 1; else x <<= 1; if (--k == 0)
{
*pout++ = 63 + x;
k = 6;
x = 0;
}
}
}
if (fwrite(outstring,sizeof(char),len,f) != len)
gt_abort(">E gentreeg: fwrite() failed\n");
}
static boolean
ishi(int *par, int n) /* Test if it has a vertex of degree 2 */
{ int degm1[MAXN+1]; /* Degrees minus 1 */ int i;
degm1[1] = -1; for (i = 2; i <= n; ++i) degm1[i] = 0; for (i = 2; i <= n; ++i) ++degm1[par[i]]; for (i = 1; i <= n; ++i) if (degm1[i] == 1) returnTRUE;
returnFALSE;
}
staticvoid
WriteIt(int level)
{ if (level < splitlevel && res != 0) return;
if (irred && ishi(par,nv)) return; #ifdef PRUNE if (PRUNE(par,nv)) return; #endif
++nout;
(*outproc)(outfile,par,nv);
}
static boolean
good( int p, int h, int t ) { if (p==2 && mindiam<=2 && t==0) returnTRUE; if (t == 1) { if (2*h>=mindiam+1 && 2*h <= maxdiam+1) { if ((p-1)*2 >= nv) returnTRUE; elseif (p - h-1 == 1) { if (par[p]> 2) returnTRUE;
} else if ((p - h-1 >=2) && ((par[h+2]>2) || (par[h+3]>2))) returnTRUE;
}
} else if (nv-p >= h && 2*h>=mindiam) { if (maxdiam==nv-1 && nv%2==0) return2*h<=maxdiam+1; elsereturn2*h <= maxdiam;
} returnFALSE;
} /* good */
staticvoid
Gen( int level, int p, int s, int cL, int h, int l, int n, int f, int g ) /* The main generation procedure. */
{ int hh,flag,entry,temp;
if (level == splitlevel)
{ if (splitcount-- != 0) return;
splitcount = mod - 1;
}
if (argnum == 0)
badargs = TRUE; elseif (minnv < 1 || maxnv > MAXN || minnv > maxnv)
{
fprintf(stderr,">E gentreeg: n must be in the range 1..%d\n",MAXN); exit(1);
}
if (badargs)
{
fprintf(stderr,">E Usage: %s\n",USAGE);
GETHELP; exit(1);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.