1*107c160aSchristos /* $NetBSD: warshall.c,v 1.11 2021/02/20 22:57:56 christos Exp $ */ 2c8b0dbc8Schristos 3*107c160aSchristos /* Id: warshall.c,v 1.9 2020/09/22 20:17:00 tom Exp */ 4f7a86c12Schristos 56f6878dfSchristos #include "defs.h" 6570bc97fSjoerg 781488cfcSjakllsch #include <sys/cdefs.h> 8*107c160aSchristos __RCSID("$NetBSD: warshall.c,v 1.11 2021/02/20 22:57:56 christos Exp $"); 981488cfcSjakllsch 10f7a86c12Schristos static void transitive_closure(unsigned * R,int n)11f7a86c12Schristostransitive_closure(unsigned *R, int n) 12f7a86c12Schristos { 13f7a86c12Schristos int rowsize; 14f7a86c12Schristos unsigned i; 15f7a86c12Schristos unsigned *rowj; 16f7a86c12Schristos unsigned *rp; 17f7a86c12Schristos unsigned *rend; 18f7a86c12Schristos unsigned *relend; 19f7a86c12Schristos unsigned *cword; 20f7a86c12Schristos unsigned *rowi; 21f7a86c12Schristos 22f7a86c12Schristos rowsize = WORDSIZE(n); 23f7a86c12Schristos relend = R + n * rowsize; 24f7a86c12Schristos 25f7a86c12Schristos cword = R; 26f7a86c12Schristos i = 0; 27f7a86c12Schristos rowi = R; 28f7a86c12Schristos while (rowi < relend) 29f7a86c12Schristos { 30*107c160aSchristos unsigned *ccol = cword; 31*107c160aSchristos 32f7a86c12Schristos rowj = R; 33f7a86c12Schristos 34f7a86c12Schristos while (rowj < relend) 35f7a86c12Schristos { 36*107c160aSchristos if (*ccol & (1U << i)) 37f7a86c12Schristos { 38f7a86c12Schristos rp = rowi; 39f7a86c12Schristos rend = rowj + rowsize; 40f7a86c12Schristos while (rowj < rend) 41f7a86c12Schristos *rowj++ |= *rp++; 42f7a86c12Schristos } 43f7a86c12Schristos else 44f7a86c12Schristos { 45f7a86c12Schristos rowj += rowsize; 46f7a86c12Schristos } 47f7a86c12Schristos 48f7a86c12Schristos ccol += rowsize; 49f7a86c12Schristos } 50f7a86c12Schristos 51f7a86c12Schristos if (++i >= BITS_PER_WORD) 52f7a86c12Schristos { 53f7a86c12Schristos i = 0; 54f7a86c12Schristos cword++; 55f7a86c12Schristos } 56f7a86c12Schristos 57f7a86c12Schristos rowi += rowsize; 58f7a86c12Schristos } 59f7a86c12Schristos } 60f7a86c12Schristos 61f7a86c12Schristos void reflexive_transitive_closure(unsigned * R,int n)62f7a86c12Schristosreflexive_transitive_closure(unsigned *R, int n) 63f7a86c12Schristos { 64f7a86c12Schristos int rowsize; 65f7a86c12Schristos unsigned i; 66f7a86c12Schristos unsigned *rp; 67f7a86c12Schristos unsigned *relend; 68f7a86c12Schristos 69f7a86c12Schristos transitive_closure(R, n); 70f7a86c12Schristos 71f7a86c12Schristos rowsize = WORDSIZE(n); 72f7a86c12Schristos relend = R + n * rowsize; 73f7a86c12Schristos 74f7a86c12Schristos i = 0; 75f7a86c12Schristos rp = R; 76f7a86c12Schristos while (rp < relend) 77f7a86c12Schristos { 78*107c160aSchristos *rp |= (1U << i); 79f7a86c12Schristos if (++i >= BITS_PER_WORD) 80f7a86c12Schristos { 81f7a86c12Schristos i = 0; 82f7a86c12Schristos rp++; 83f7a86c12Schristos } 84f7a86c12Schristos 85f7a86c12Schristos rp += rowsize; 86f7a86c12Schristos } 87f7a86c12Schristos } 88