// Basic preflow-push #include #include // Basic Definitions #define oo 1000000000 // Declarations int n; // number of nodes int e; // number of edges struct edge { int tail,head,capacity,flow,inverse; }; typedef struct edge edgeType; edgeType *edgeTab; int *firstEdge; // Table indicating first in range of edges with a common tail int *excessFlow,*height; int min (int x, int y) { return xtail - y->tail; if (result!=0) return result; else return x->head - y->head; } void read_input_file() { int a,b,c,i,j,numEdges; edgeType work; edgeType *ptr; FILE* input = fopen("mf.in","r"); // read number of nodes and edges fscanf(input,"%d %d",&n,&e); edgeTab=(edgeType*) malloc(2*e*sizeof(edgeType)); if (!edgeTab) { printf("edgeTab malloc failed\n"); exit(0); } // read edge capacities numEdges=0; for (i=0; i=n || b<0 || b>=n || c<=0) { printf("Invalid input %d %d %d\n",a,b,c); exit(0); } edgeTab[numEdges].tail=a; edgeTab[numEdges].head=b; edgeTab[numEdges].capacity=c; numEdges++; edgeTab[numEdges].tail=b; edgeTab[numEdges].head=a; edgeTab[numEdges].capacity=0; numEdges++; } fclose(input); // sort edges qsort(edgeTab,numEdges,sizeof(edgeType),tailThenHead); // coalesce duplicates j=0; for (i=1; i0) { j=edgeTab[i].head; printf("%3d %3d %8d %7d\n",i,j, edgeTab[i].capacity,edgeTab[i].flow); } } initializePreflow() { int i,j; for (i=0;i0) { edgeTab[i].flow=edgeTab[i].capacity; edgeTab[edgeTab[i].inverse].flow=(-edgeTab[i].capacity); excessFlow[edgeTab[i].head]=edgeTab[i].capacity; } } int preflowPushLoop() { int foundOperation,didPush,i,j,k,dF,minHeight; foundOperation=1; while (foundOperation) { foundOperation=0; for (i=1;i0) { didPush=0; for (k=firstEdge[i];k0 && height[i]==height[j]+1) { dF=min(excessFlow[i],edgeTab[k].capacity-edgeTab[k].flow); printf("debug: pushing %d units from %d to %d\n", dF,i,j); edgeTab[k].flow+=dF; edgeTab[edgeTab[k].inverse].flow=(-edgeTab[k].flow); excessFlow[i]-=dF; excessFlow[j]+=dF; didPush=1; foundOperation=1; if (excessFlow[i]==0) break; } } if (!didPush) { minHeight=oo; for (k=firstEdge[i];k0 && height[j]0) printf("%d->%d has %d\n",edgeTab[i].tail, edgeTab[i].head,edgeTab[i].flow); free(height); free(excessFlow); free(edgeTab); free(firstEdge); return 0; }