#define HELPTEXT \ " Take the linegraphs of a file of graphs.\n\
Input graphs with no edges produce only a warning message.\n\
\n\
The output file has a header ifand only if the input file does.\n\
\n\
-t make the total graph\n\
-q Suppress auxiliary information.\n"
staticvoid
linegraph(sparsegraph *g, sparsegraph *h) /* h := linegraph of g */ /* Has the side effect of sorting the edge lists of g */
{
DYNALLSTAT(size_t,eno,eno_sz); /* edge number */ int *ge,*gd,*he,*hd;
size_t *gv,*hv; int gnv,hnv,jj;
size_t i,j,k,gnde,hnde,xhnde,num;
size_t hi,lo,mid,v,w;
hnv = gnde/2; if (hnv != gnde/2) gt_abort(">E linegraphg: too many input edges\n");
hnde = 0;
num = 0; for (i = 0; i < gnv; ++i)
{
xhnde = hnde;
hnde += gd[i]*((size_t)gd[i]-1); if (hnde < xhnde) gt_abort(">E linegraphg: too many output edges\n");
for (j = gv[i]; j < gv[i]+gd[i]; ++j)
{ if (ge[j] == i)
gt_abort(">E linegraphg can't handle loops\n"); elseif (ge[j] > i)
eno[j] = num++; else
{
lo = gv[ge[j]];
hi = lo + gd[ge[j]] - 1; while (lo <= hi)
{
mid = lo + (hi-lo)/2; if (ge[mid] == i) break; elseif (ge[mid] < i) lo = mid+1; else hi = mid-1;
} if (lo > hi)
gt_abort(">E linegraphg : binary search failed\n");
eno[j] = eno[mid];
}
}
}
staticvoid
totalgraph(sparsegraph *g, sparsegraph *h) /* h := total graph of g */ /* Has the side effect of sorting the edge lists of g */
{
DYNALLSTAT(size_t,eno,eno_sz); /* edge number */ int *ge,*gd,*he,*hd;
size_t *gv,*hv; int gnv,hnv,jj;
size_t i,j,k,gnde,hnde,xhnde,num;
size_t hi,lo,mid,v,w;
hnv = gnv + gnde/2; if (hnv - gnv != gnde/2) gt_abort(">E linegraphg: too many input edges\n");
hnde = 3*gnde; if (hnde/3 != gnde) gt_abort(">E linegraphg: too many output edges\n");
num = gnv; for (i = 0; i < gnv; ++i)
{
xhnde = hnde;
hnde += gd[i]*((size_t)gd[i]-1); if (hnde < xhnde) gt_abort(">E linegraphg: too many output edges\n");
for (j = gv[i]; j < gv[i]+gd[i]; ++j)
{ if (ge[j] == i)
gt_abort(">E linegraphg can't handle loops\n"); elseif (ge[j] > i)
eno[j] = num++; else
{
lo = gv[ge[j]];
hi = lo + gd[ge[j]] - 1; while (lo <= hi)
{
mid = lo + (hi-lo)/2; if (ge[mid] == i) break; elseif (ge[mid] < i) lo = mid+1; else hi = mid-1;
} if (lo > hi)
gt_abort(">E linegraphg : binary search failed\n");
eno[j] = eno[mid];
}
}
}
for (i = 0; i < gnv; ++i) hd[i] = 2*gd[i]; for (i = gnv; i < hnv; ++i) hd[i] = 2;
for (i = 0; i < gnv; ++i)
{ for (j = gv[i]; j < gv[i]+gd[i]; ++j)
hd[eno[j]] += gd[i]-1;
}
hv[0] = 0; for (i = 1; i < hnv; ++i) hv[i] = hv[i-1] + hd[i-1]; if (hnde - hv[hnv-1] != hd[hnv-1])
gt_abort(">E linegraphg: too many output edges\n"); for (i = 0; i < hnv; ++i) hd[i] = 0;
for (i = 0; i < gnv; ++i)
{ for (j = gv[i]; j < gv[i]+gd[i]; ++j)
{
v = eno[j];
he[hv[i]+(hd[i]++)] = ge[j];
he[hv[i]+(hd[i]++)] = v;
he[hv[v]+(hd[v]++)] = i;
}
}
for (i = 0; i < gnv; ++i)
{ for (jj = 0; jj < gd[i]-1; ++jj)
{
j = gv[i] + jj; for (k = j+1; k < gv[i]+gd[i]; ++k)
{
v = eno[j]; w = eno[k];
he[hv[v]+(hd[v]++)] = w;
he[hv[w]+(hd[w]++)] = v;
}
}
}
}
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.