예제 #1
0
파일: gentourng.c 프로젝트: igraph/nautier
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: gutil1.c 프로젝트: 3ki5tj/nauty
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];
        }
    }
}
예제 #4
0
파일: gutil1.c 프로젝트: 3ki5tj/nauty
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;
}
예제 #5
0
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;
}