@@ -332,6 +332,93 @@ void makeSierpinski(int depth, edgefn ef)
332332 free (graph );
333333}
334334
335+ static void
336+ constructTetrix (int v1 , int v2 , int v3 , int v4 , int depth , vtx_data * graph )
337+ {
338+ static int last_used_node_name = 4 ;
339+ int v5 , v6 , v7 , v8 , v9 , v10 ;
340+
341+ int nedges ;
342+
343+ if (depth > 0 ) {
344+ v5 = ++ last_used_node_name ;
345+ v6 = ++ last_used_node_name ;
346+ v7 = ++ last_used_node_name ;
347+ v8 = ++ last_used_node_name ;
348+ v9 = ++ last_used_node_name ;
349+ v10 = ++ last_used_node_name ;
350+ constructTetrix (v1 , v5 , v6 , v8 , depth - 1 , graph );
351+ constructTetrix (v2 , v6 , v7 , v9 , depth - 1 , graph );
352+ constructTetrix (v3 , v5 , v7 , v10 , depth - 1 , graph );
353+ constructTetrix (v4 , v8 , v9 , v10 , depth - 1 , graph );
354+ return ;
355+ }
356+ // depth==0, Construct graph:
357+ nedges = graph [v1 ].nedges ;
358+ graph [v1 ].edges [nedges ++ ] = v2 ;
359+ graph [v1 ].edges [nedges ++ ] = v3 ;
360+ graph [v1 ].edges [nedges ++ ] = v4 ;
361+ graph [v1 ].nedges = nedges ;
362+
363+ nedges = graph [v2 ].nedges ;
364+ graph [v2 ].edges [nedges ++ ] = v1 ;
365+ graph [v2 ].edges [nedges ++ ] = v3 ;
366+ graph [v2 ].edges [nedges ++ ] = v4 ;
367+ graph [v2 ].nedges = nedges ;
368+
369+ nedges = graph [v3 ].nedges ;
370+ graph [v3 ].edges [nedges ++ ] = v1 ;
371+ graph [v3 ].edges [nedges ++ ] = v2 ;
372+ graph [v3 ].edges [nedges ++ ] = v4 ;
373+ graph [v3 ].nedges = nedges ;
374+
375+ nedges = graph [v4 ].nedges ;
376+ graph [v4 ].edges [nedges ++ ] = v1 ;
377+ graph [v4 ].edges [nedges ++ ] = v2 ;
378+ graph [v4 ].edges [nedges ++ ] = v3 ;
379+ graph [v4 ].nedges = nedges ;
380+
381+ return ;
382+
383+ }
384+
385+ void makeTetrix (int depth , edgefn ef )
386+ {
387+ vtx_data * graph ;
388+ int * edges ;
389+ int n ;
390+ int nedges ;
391+ int i , j ;
392+
393+ depth -- ;
394+ n = 4 + 2 * (((int ) (pow (4.0 , (double ) depth ) + 0.5 ) - 1 ));
395+
396+ nedges = (int ) (pow (6.0 , depth + 1.0 ) + 0.5 );
397+
398+ graph = N_NEW (n + 1 , vtx_data );
399+ edges = N_NEW (6 * n , int );
400+
401+ for (i = 1 ; i <= n ; i ++ ) {
402+ graph [i ].edges = edges ;
403+ edges += 6 ;
404+ graph [i ].nedges = 0 ;
405+ }
406+
407+ constructTetrix (1 , 2 , 3 , 4 , depth , graph );
408+
409+ for (i = 1 ; i <= n ; i ++ ) {
410+ int nghbr ;
411+ // write the neighbors of the node i
412+ for (j = 0 ; j < graph [i ].nedges ; j ++ ) {
413+ nghbr = graph [i ].edges [j ];
414+ if (i < nghbr ) ef ( i , nghbr );
415+ }
416+ }
417+
418+ free (graph [1 ].edges );
419+ free (graph );
420+ }
421+
335422void makeHypercube (int dim , edgefn ef )
336423{
337424 int i , j , n ;
0 commit comments