static boolean isstrong(graph *g, int n) /* test if tournament g is strongly-connected * This code is strictly for tournaments only. */ { setword seen,expanded,toexpand,allbits; int i; allbits = ALLMASK(n); seen = bit[0] | g[0]; expanded = bit[0]; while (seen != allbits && (toexpand = (seen & ~expanded))) /* not == */ { i = FIRSTBITNZ(toexpand); expanded |= bit[i]; seen |= g[i]; } if (seen != allbits) return FALSE; seen = (allbits ^ g[0]); expanded = bit[0]; while (seen != allbits && (toexpand = (seen & ~expanded))) /* not == */ { i = FIRSTBITNZ(toexpand); expanded |= bit[i]; seen |= (g[i] ^ allbits); } return seen == allbits; }
static boolean distinvar(graph *g, int *invar, int n1, int n2) /* make distance invariant/ exit immediately FALSE if n-1 not maximal else exit TRUE Note: only invar[n1..n1+n2-1] set */ { int w,n; setword workset,frontier; setword sofar; int inv,d,v; n = n1 + n2; for (v = n-1; v >= n1; --v) { inv = 0; sofar = frontier = bit[v]; for (d = 1; frontier != 0; ++d) { workset = 0; inv += POPCOUNT(frontier) ^ (0x57 + d); while (frontier) { w = FIRSTBITNZ(frontier); frontier &= ~bit[w]; workset |= g[w]; } frontier = workset & ~sofar; sofar |= frontier; } invar[v] = inv; if (v < n-1 && inv > invar[n-1]) return FALSE; } return TRUE; }
boolean isbiconnected1(graph *g, int n) /* Test if g is biconnected; version for m=1. */ { int sp,v,w; setword sw; int numvis; setword visited; int num[WORDSIZE],lp[WORDSIZE],stack[WORDSIZE]; if (n <= 2) return FALSE; visited = bit[0]; stack[0] = 0; num[0] = 0; lp[0] = 0; numvis = 1; sp = 0; v = 0; for (;;) { if ((sw = g[v] & ~visited)) /* not "==" */ { w = v; v = FIRSTBITNZ(sw); /* visit next child */ stack[++sp] = v; visited |= bit[v]; lp[v] = num[v] = numvis++; sw = g[v] & visited & ~bit[w]; while (sw) { w = FIRSTBITNZ(sw); sw &= ~bit[w]; if (num[w] < lp[v]) lp[v] = num[w]; } } else { w = v; /* back up to parent */ if (sp <= 1) return numvis == n; v = stack[--sp]; if (lp[w] >= num[v]) return FALSE; if (lp[w] < lp[v]) lp[v] = lp[w]; } } }
boolean isconnected1(graph *g, int n) /* test if g is connected (m=1) */ { setword seen,expanded,toexpand; int i; seen = bit[0]; expanded = 0; while ((toexpand = (seen & ~expanded)) != 0) { i = FIRSTBITNZ(toexpand); expanded |= bit[i]; seen |= g[i]; } return POPCOUNT(seen) == n; }
static boolean isconnected(graph *g, int n) /* test if g is connected */ { setword seen,expanded,toexpand,allbits; int i; allbits = ALLMASK(n); expanded = bit[n-1]; seen = expanded | g[n-1]; while (seen != allbits && (toexpand = (seen & ~expanded))) /* not == */ { i = FIRSTBITNZ(toexpand); expanded |= bit[i]; seen |= g[i]; } return seen == allbits; }