96 printf(
"\n#vertices %d (nX %d, nY %d), #edges %d, type %d, totvwght %d\n",
99 for (u = 0; u < G->
nvtx; u++)
101 printf(
"--- adjacency list of vertex %d (weight %d):\n", u, G->
vwght[u]);
103 istop = G->
xadj[u+1];
104 for (i = istart; i < istop; i++)
105 { printf(
"%5d", G->
adjncy[i]);
106 if ((++count % 16) == 0)
109 if ((count % 16) != 0)
120 PORD_INT *xadj, *adjncy, *vwght, *xadjGb, *adjncyGb, *vwghtGb;
121 PORD_INT nvtx, nedgesGb, totvwght, u,
x,
y, i, j, jstart, jstop, ptr;
132 for (i = 0; i < nX+nY; i++)
133 { u = bipartvertex[i];
134 if ((u < 0) || (u >= nvtx))
135 { fprintf(stderr,
"\nError in function setupBipartiteGraph\n"
136 " node %d does not belong to graph\n", u);
141 for (j = jstart; j < jstop; j++)
142 vtxmap[adjncy[j]] = -1;
143 nedgesGb += (jstop - jstart);
145 for (i = 0; i < nX+nY; i++)
146 { u = bipartvertex[i];
151 xadjGb = Gbipart->
G->
xadj;
153 vwghtGb = Gbipart->
G->
vwght;
158 totvwght = 0; ptr = 0;
159 for (i = 0; i < nX; i++)
160 {
x = bipartvertex[i];
162 vwghtGb[i] = vwght[
x];
163 totvwght += vwght[
x];
166 for (j = jstart; j < jstop; j++)
169 adjncyGb[ptr++] = vtxmap[
y];
172 for (i = nX; i < nX+nY; i++)
173 {
y = bipartvertex[i];
175 vwghtGb[i] = vwght[
y];
176 totvwght += vwght[
y];
179 for (j = jstart; j < jstop; j++)
181 if ((vtxmap[
x] >= 0) && (vtxmap[
x] < nX))
182 adjncyGb[ptr++] = vtxmap[
x];
196{
PORD_INT *xadj, *adjncy, *level, *marker, *queue, *stack;
197 PORD_INT top, top2, u,
x, x2,
y, y2, nX, nY, i, istart, istop;
200 xadj = Gbipart->
G->
xadj;
213 for (u = 0; u < nX+nY; u++)
219 for (
x = 0;
x < nX;
x++)
222 for (i = istart; i < istop; i++)
224 if (matching[
y] ==
FREE)
236 {
for (u = 0; u < nX+nY; u++)
237 level[u] = marker[u] = -1;
239 for (
x = 0;
x < nX;
x++)
240 if (matching[
x] ==
FREE)
241 { queue[qtail++] =
x;
251 while (qhead != qtail)
252 {
x = queue[qhead++];
253 if (level[
x] < max_level)
256 for (i = istart; i < istop; i++)
259 { level[
y] = level[
x] + 1;
260 if (matching[
y] ==
FREE)
261 { max_level = level[
y];
264 else if (level[
y] < max_level)
266 level[x2] = level[
y] + 1;
289 if ((marker[
x] == -1) && (level[
x] == level[
y]-1))
293 { y2 = stack[--top2];
302 marker[y2] = xadj[y2];
314 free(level); free(marker);
315 free(queue); free(stack);
323{
PORD_INT *xadj, *adjncy, *vwght, *parent, *marker, *queue;
324 PORD_INT nedges, u, v,
x,
y, nX, nY, j, i, istart, istop;
328 xadj = Gbipart->
G->
xadj;
330 vwght = Gbipart->
G->
vwght;
341 for (u = 0; u < nX+nY; u++)
343 for (i = 0; i < nedges; i++)
349 for (
x = 0;
x < nX;
x++)
352 for (i = istart; i < istop; i++)
359 for (j = xadj[
y]; adjncy[j] !=
x; j++);
362 if (
rc[
x] == 0)
break;
370 {
for (u = 0; u < nX+nY; u++)
371 parent[u] = marker[u] = -1;
373 for (
x = 0;
x < nX;
x++)
375 { queue[qtail++] =
x;
383 while (qhead != qtail)
384 { u = queue[qhead++];
387 for (i = istart; i < istop; i++)
389 if ((parent[v] == -1) && ((v >= nX) || (flow[i] < 0)))
396 if ((v >= nX) && (
rc[v] > 0))
399 while (parent[u] != u)
403 capacity =
min(capacity, -flow[i]);
405 capacity =
min(capacity,
rc[u]);
407 while (parent[v] != v)
411 for (j = xadj[v]; adjncy[j] != u; j++);
427 free(parent); free(marker);
436{
PORD_INT *xadj, *adjncy, *vwght, *queue, qhead, qtail;
439 xadj = Gbipart->
G->
xadj;
441 vwght = Gbipart->
G->
vwght;
451 for (
x = 0;
x < nX;
x++)
452 if (matching[
x] ==
FREE)
453 { queue[qtail++] =
x;
457 for (
y = nX;
y < nX+nY;
y++)
458 if (matching[
y] ==
FREE)
459 { queue[qtail++] =
y;
467 while (qhead != qtail)
468 { u = queue[qhead++];
473 for (i = istart; i < istop; i++)
476 { queue[qtail++] =
y;
487 for (i = istart; i < istop; i++)
490 { queue[qtail++] =
x;
506 dmwght[
SI] = dmwght[
SX] = dmwght[
SR] = 0;
507 for (
x = 0;
x < nX;
x++)
509 {
case SI: dmwght[
SI] += vwght[
x];
break;
510 case SX: dmwght[
SX] += vwght[
x];
break;
511 case SR: dmwght[
SR] += vwght[
x];
break;
513 dmwght[
BI] = dmwght[
BX] = dmwght[
BR] = 0;
514 for (
y = nX;
y < nX+nY;
y++)
516 {
case BI: dmwght[
BI] += vwght[
y];
break;
517 case BX: dmwght[
BX] += vwght[
y];
break;
518 case BR: dmwght[
BR] += vwght[
y];
break;
529{
PORD_INT *xadj, *adjncy, *vwght, *queue, qhead, qtail;
530 PORD_INT u, v,
x, nX,
y, nY, i, istart, istop;
532 xadj = Gbipart->
G->
xadj;
534 vwght = Gbipart->
G->
vwght;
544 for (
x = 0;
x < nX;
x++)
546 { queue[qtail++] =
x;
549 else dmflag[
x] =
FREE;
550 for (
y = nX;
y < nX+nY;
y++)
552 { queue[qtail++] =
y;
555 else dmflag[
y] =
FREE;
560 while (qhead != qtail)
561 { u = queue[qhead++];
566 for (i = istart; i < istop; i++)
568 if ((dmflag[v] ==
FREE) && ((v >= nX) || (flow[i] < 0)))
569 { queue[qtail++] = v;
575 for (i = istart; i < istop; i++)
577 if ((dmflag[v] ==
FREE) && ((v < nX) || (flow[i] > 0)))
578 { queue[qtail++] = v;
591 dmwght[
SI] = dmwght[
SX] = dmwght[
SR] = 0;
592 for (
x = 0;
x < nX;
x++)
594 {
case SOURCE: dmflag[
x] =
SI; dmwght[
SI] += vwght[
x];
break;
595 case SINK: dmflag[
x] =
SX; dmwght[
SX] += vwght[
x];
break;
596 default: dmflag[
x] =
SR; dmwght[
SR] += vwght[
x];
604 dmwght[
BI] = dmwght[
BX] = dmwght[
BR] = 0;
605 for (
y = nX;
y < nX+nY;
y++)
607 {
case SOURCE: dmflag[
y] =
BX; dmwght[
BX] += vwght[
y];
break;
608 case SINK: dmflag[
y] =
BI; dmwght[
BI] += vwght[
y];
break;
609 default: dmflag[
y] =
BR; dmwght[
BR] += vwght[
y];
void freeBipartiteGraph(gbipart_t *Gbipart)
gbipart_t * setupBipartiteGraph(graph_t *G, PORD_INT *bipartvertex, PORD_INT nX, PORD_INT nY, PORD_INT *vtxmap)
void DMviaMatching(gbipart_t *Gbipart, PORD_INT *matching, PORD_INT *dmflag, PORD_INT *dmwght)
void DMviaFlow(gbipart_t *Gbipart, PORD_INT *flow, PORD_INT *rc, PORD_INT *dmflag, PORD_INT *dmwght)
void printGbipart(gbipart_t *Gbipart)
void maximumFlow(gbipart_t *Gbipart, PORD_INT *flow, PORD_INT *rc)
void maximumMatching(gbipart_t *Gbipart, PORD_INT *matching)
gbipart_t * newBipartiteGraph(PORD_INT nX, PORD_INT nY, PORD_INT nedges)
#define mymalloc(ptr, nr, type)
graph_t * newGraph(PORD_INT, PORD_INT)
void freeGraph(graph_t *)
struct _gbipart gbipart_t