296 PORD_INT *xadj, *adjncy, *color, *cwght, *map;
297 PORD_INT *flow, *
rc, *matching, *dmflag, dmwght[6];
298 PORD_INT nvtx, smoothed, nX, nX2, nY,
x,
y, u, i, j, jstart, jstop;
299
300 nvtx = Gbisect->
G->
nvtx;
301 xadj = Gbisect->
G->
xadj;
303 color = Gbisect->
color;
304 cwght = Gbisect->
cwght;
305 nX = *pnX;
306
307
308
309
311
312
313
314
315 nY = 0;
316 for (i = 0; i < nX; i++)
317 {
x = bipartvertex[i];
320 for (j = jstart; j < jstop; j++)
322 if (color[
y] == black)
323 { bipartvertex[nX+nY++] =
y;
325 }
326 }
327 }
328 for (i = nX; i < nX+nY; i++)
329 {
y = bipartvertex[i];
331 }
332
333
334
335
337
339 switch(Gbipart->
G->
type)
344 free(matching);
345 break;
351 free(flow);
353 break;
354 default:
355 fprintf(stderr, "\nError in function smoothSeparator\n"
356 " unrecognized bipartite graph type %d\n", Gbipart->
G->
type);
358 }
359
360#ifdef DEBUG
361 printf("Dulmage-Mendelsohn decomp. computed\n"
362 "SI %d, SX %d, SR %d, BI %d, BX %d, BR %d\n", dmwght[
SI], dmwght[
SX],
363 dmwght[
SR], dmwght[
BI], dmwght[
BX], dmwght[
BR]);
364#endif
365
366
367
368
369
370
372 if (
F(cwght[
GRAY]-dmwght[
SI]+dmwght[
BX], cwght[black]-dmwght[
BX],
373 cwght[white]+dmwght[
SI]) +
EPS <
F(cwght[
GRAY], cwght[black],
374 cwght[white]))
376
377#ifdef DEBUG
378 printf("exchange SI with BX\n");
379#endif
380
381 cwght[white] += dmwght[
SI]; cwght[
GRAY] -= dmwght[
SI];
382 cwght[black] -= dmwght[
BX]; cwght[
GRAY] += dmwght[
BX];
383 for (i = 0; i < nX+nY; i++)
384 { u = bipartvertex[i];
385 if (dmflag[map[u]] ==
SI)
386 color[u] = white;
387 if (dmflag[map[u]] ==
BX)
389 }
390 }
391
392
393
394
395
396
397
398
399 if ((
F(cwght[
GRAY]-dmwght[
SR]+dmwght[
BR], cwght[black]-dmwght[
BR],
400 cwght[white]+dmwght[
SR]) +
EPS <
F(cwght[
GRAY], cwght[black],
401 cwght[white]))
402 && ((smoothed) || (dmwght[
SI] == 0)))
404
405#ifdef DEBUG
406 printf("exchange SR with BR\n");
407#endif
408
409 cwght[white] += dmwght[
SR]; cwght[
GRAY] -= dmwght[
SR];
410 cwght[black] -= dmwght[
BR]; cwght[
GRAY] += dmwght[
BR];
411 for (i = 0; i < nX+nY; i++)
412 { u = bipartvertex[i];
413 if (dmflag[map[u]] ==
SR)
414 color[u] = white;
415 if (dmflag[map[u]] ==
BR)
417 }
418 }
419
420
421
422
423 nX2 = 0;
424 for (i = 0; i < nX+nY; i++)
425 { u = bipartvertex[i];
426 if (color[u] ==
GRAY)
427 bipartvertex[nX2++] = u;
428 }
429 *pnX = nX2;
430
431
432
433
434 free(map); free(dmflag);
436 return(smoothed);
437}
void DMviaMatching(gbipart_t *, PORD_INT *, PORD_INT *, PORD_INT *)
void DMviaFlow(gbipart_t *, PORD_INT *, PORD_INT *, PORD_INT *, PORD_INT *)
void freeBipartiteGraph(gbipart_t *)
gbipart_t * setupBipartiteGraph(graph_t *, PORD_INT *, PORD_INT, PORD_INT, PORD_INT *)
void maximumFlow(gbipart_t *, PORD_INT *, PORD_INT *)
void maximumMatching(gbipart_t *, PORD_INT *)
struct _gbipart gbipart_t