Select Git revision
Forked from
gmsh / gmsh
Source project has a limited visibility.
mincover.c 7.04 KiB
/*
* Copyright 1997, Regents of the University of Minnesota
*
* mincover.c
*
* This file implements the minimum cover algorithm
*
* Started 8/1/97
* George
*
* $Id: mincover.c,v 1.1 2005-09-07 14:36:45 remacle Exp $
*/
#include <metis.h>
/*************************************************************************
* Constants used by mincover algorithm
**************************************************************************/
#define INCOL 10
#define INROW 20
#define VC 1
#define SC 2
#define HC 3
#define VR 4
#define SR 5
#define HR 6
/*************************************************************************
* This function returns the min-cover of a bipartite graph.
* The algorithm used is due to Hopcroft and Karp as modified by Duff etal
* adj: the adjacency list of the bipartite graph
* asize: the number of vertices in the first part of the bipartite graph
* bsize-asize: the number of vertices in the second part
* 0..(asize-1) > A vertices
* asize..bsize > B vertices
*
* Returns:
* cover : the actual cover (array)
* csize : the size of the cover
**************************************************************************/
void MinCover(idxtype *xadj, idxtype *adjncy, int asize, int bsize, idxtype *cover, int *csize)
{
int i, j;
idxtype *mate, *queue, *flag, *level, *lst;
int fptr, rptr, lstptr;
int row, maxlevel, col;
mate = idxsmalloc(bsize, -1, "MinCover: mate");
flag = idxmalloc(bsize, "MinCover: flag");
level = idxmalloc(bsize, "MinCover: level");
queue = idxmalloc(bsize, "MinCover: queue");
lst = idxmalloc(bsize, "MinCover: lst");
/* Get a cheap matching */
for (i=0; i<asize; i++) {
for (j=xadj[i]; j<xadj[i+1]; j++) {
if (mate[adjncy[j]] == -1) {
mate[i] = adjncy[j];
mate[adjncy[j]] = i;
break;
}
}
}
/* Get into the main loop */
while (1) {
/* Initialization */
fptr = rptr = 0; /* Empty Queue */
lstptr = 0; /* Empty List */