#define HELPTEXT \ " Read two graphs in graph6/sparse6 format and write their product\n\
in sparse6 or dreadnaut format.\n\
-d : Dreadnaut format (default is sparse6)\n\
\n\
-c : Cartesian product\n\
-l : Lexicographic product (G1[G2])\n\
-L : Lexicographic product (G2[G1])\n\
-t : Tensor (Kronecker, categorical) product\n\
-k : Complete (strong, normal) product\n\
-a# : general case (argument is a 3-digit octal number)\n\
Add these values giving the condition for an edge:\n\
Code: 400 200 100 040 020 010 004 002 001\n\
Graph1: same same same adj adj adj nonadj nonadj nonadj\n\
Graph2: same adj nonadj same adj nonadj same adj nonadj\n"
if ((g1 = readgg(infile,NULL,0,&m1,&n1,&digraph)) == NULL)
gt_abort(">E first graph not found\n"); if (digraph) gt_abort(">E productg does not support digraphs yet.\n");
if ((g2 = readgg(infile,NULL,0,&m2,&n2,&digraph)) == NULL)
gt_abort(">E second graph not found\n"); if (digraph) gt_abort(">E productg does not support digraphs yet.\n");
if ((long)n1 * (long)n2 > NAUTY_INFINITY-2)
gt_abort(">E product would be too large\n");
if (dreadnaut)
{
fprintf(outfile,"n=%ld $=0 g\n",n1*(long)n2);
for (v1 = 0; v1 < n1; ++v1) for (v2 = 0; v2 < n2; ++v2)
{
fprintf(outfile,"%ld:",N(v1,v2)); for (w1 = v1; w1 < n1; ++w1) for (w2 = 0; w2 < n2; ++w2)
{ if ((w1 > v1 || w2 > v2) && ADJ(v1,v2,w1,w2))
fprintf(outfile," %ld",N(w1,w2));
}
fprintf(outfile,"\n");
}
fprintf(outfile,". $$\n");
} else
{
nv = n1*n2;
SG_ALLOC(sg,nv,0,"productg");
v = sg.v;
d = sg.d; for (i = 0; i < nv; ++i) d[i] = 0; for (v1 = 0; v1 < n1; ++v1) for (v2 = 0; v2 < n2; ++v2)
{
xx = N(v1,v2); for (w1 = v1; w1 < n1; ++w1) for (w2 = 0; w2 < n2; ++w2)
{ if ((w1 > v1 || w2 > v2) && ADJ(v1,v2,w1,w2))
{
yy = N(w1,w2);
++d[xx];
++d[yy];
}
}
}
twone = 0; for (i = 0; i < nv; ++i) twone += d[i];
SG_ALLOC(sg,nv,twone,"productg"); if (v != sg.v || d != sg.d)
gt_abort(">E productg: SG_ALLOC problem\n");
e = sg.e;
v[0] = 0; for (i = 1; i < nv; ++i) v[i] = v[i-1] + d[i-1]; for (i = 0; i < nv; ++i) d[i] = 0;
for (v1 = 0; v1 < n1; ++v1) for (v2 = 0; v2 < n2; ++v2)
{
xx = N(v1,v2); for (w1 = v1; w1 < n1; ++w1) for (w2 = 0; w2 < n2; ++w2)
{ if ((w1 > v1 || w2 > v2) && ADJ(v1,v2,w1,w2))
{
yy = N(w1,w2);
e[v[xx]+d[xx]++] = yy;
e[v[yy]+d[yy]++] = xx;
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.