/* Title: Flat Graph Generator (Improved version - June 1994, April, 1995) file: flat.c Does: Generates quasi-random k-colorable graphs that may be used to test coloring algorithms. These may or may not be harder than equi-partite graphs, but for values near the ridge they do give iterated greedy a rougher time. Source: Joseph Culberson's Coloring Page http://web.cs.ualberta.ca/~joe/Coloring/index.html Author: Joseph Culberson Integrated with graph generator by Denis Papp May, 1995 email: joe@cs.ualberta.ca dpapp@cs.ualberta.ca Compilation: C Code Inputs: various parameters: the graph, size (# vertices), edge probability (0.0 - 1.0), flatness (0 = max difficulty (??) ), pointer to long to contain # edges assigned Outputs: the generated flat graph Copyright: Joseph Culberson. Permission is granted to use and distribute freely for non-commercial purposes. Warranty: NONE! Special Instructions: Have fun! Part of: The k-colorable graph generator program. */ #include "generate.h" #include void assign1(graph,vset,size,nedges,b1,b2,large,part,flat) graphtype graph; int *vset,size,nedges,b1,b2,large,part; int flat; { int nv, npairs,f1,f2,l1,l2; int i,j,v,w,vp; int *psetx, *psety; int deg1,deg2; int *dg1, *dg2; nv = (int) (size/part); /* compute first and last vertices of block b1 */ if (b1 < large) f1 = (nv+1) * b1; else f1 = (nv+1)*large + (b1-large)*nv; if ((b1+1) < large) l1 = (nv+1)*(b1+1); else l1 = (nv+1)*large +((b1+1-large)*nv); /* compute first and last vertices of block b2 */ if (b2 < large) f2 = (nv+1) * b2; else f2 = (nv+1)*large + (b2-large)*nv; if ((b2+1) < large) l2 = (nv+1)*(b2+1); else l2 = (nv+1)*large +((b2+1 -large)*nv); npairs = (l1-f1)*(l2-f2); psetx = (int *) calloc(npairs, sizeof(int)); psety = (int *) calloc(npairs, sizeof(int)); dg1 = (int *) calloc(l1,sizeof(int)); dg2 = (int *) calloc(l2,sizeof(int)); deg1 = nedges/(l1-f1); if ( (deg1*(l1-f1)) < nedges ) deg1++; deg1 += flat; deg2 = nedges/(l2-f2); if ( (deg2*(l2-f2)) < nedges ) deg2++; deg2 += flat; for(i=f1;i 1) { /* number of vertices in large block */ nvert = 1+ (int) (size/part); /* number of pairs of blocks */ npairs = (large*(large-1))/2; /* Expected number of edges assigned between large pairs */ nedges = (int) ( npairs *nvert *nvert *prob); /* to distribute, need to know how many take ceiling */ residue = nedges % npairs; nedges = nedges / npairs; for(i=0;i 0) { /*************************************/ /*assign edges large and small blocks */ /*************************************/ /* number of vertices in large block */ nvert = (int) (size/part); /* number of pairs of blocks */ npairs = large*(part-large); /* Expected number of edges assigned between all pairs */ nedges = (int) ( npairs *nvert *(nvert+1) *prob); /* to distribute, need to know how many take ceiling */ residue = nedges % npairs; /* and how many per pair (floor) */ nedges = nedges / npairs; for(i=0;i 1) && (large<(part-1))) { /*************************************/ /* assign edges between small blocks */ /*************************************/ /* number of vertices in large block */ nvert = (int) (size/part); /* number of pairs of blocks */ npairs = ((part-large)*(part-1-large))/2; /* Expected number of edges assigned between all pairs */ nedges = (int) ( npairs *nvert *nvert *prob); /* to distribute, need to know how many take ceiling */ residue = nedges % npairs; /* and how many per pair (floor) */ nedges = nedges / npairs; for(i=large;i