A graph generator

Richard Suchenwirth - As another part of Graph theory in Tcl, here's a routine that produces a graph description (list of edges like x,y, where x and y are the adjacent vertices; edges are labeled here as increasing integers) for complete r-partite graphs. You specify the number of partitions (what is written as exponent to K in textbooks) and optionally the size of each partition (conventionally subscript to K, defaults to 1):

 proc graphK {nPartitions {sizeOfPartition 1}} {
    set partitions {}
    set no 0
    for {set i 0} {$i<$nPartitions} {incr i} {
        set partition {}
        for {set j 0} {$j<$sizeOfPartition} {incr j} {
            lappend partition [incr no]
        }
        lappend partitions $partition
    }
    foreach p $partitions {
        foreach p2 $partitions {
            if {$p==$p2} continue ;# no edges inside a partition
            foreach vertex $p {
                foreach v2 $p2 {
                    if {$vertex>$v2} break
                    lappend res $vertex,$v2
                }
            }
        }
    }
    set res
 }

Now testing with the two minimal non-planar graphs, that cannot be drawn on a flat surface without crossing edges:

 0 % graphK 5   ;# pentagram in a pentagon
 1,2 1,3 1,4 1,5 2,3 2,4 2,5 3,4 3,5 4,5
 0 % graphK 2 3 ;# "Gas-Water-Electricity" graph
 1,4 1,5 1,6 2,4 2,5 2,6 3,4 3,5 3,6

What is so different about Tcl that it that I enjoy writing such algorithms at breakfast? - One of these weekends I will of course pipe the graph generator's output into a graph layouter - that's what these seemingly academic exercises are really aiming at...