aboutsummaryrefslogtreecommitdiffstats
path: root/test/ccured_olden/mst/makegraph.c
blob: c99fad9642b4faf1e6d74dd01a2457596a796fd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* For copyright information, see olden_v1.0/COPYRIGHT */

#include "mst.h"
#include "ssplain.h"

#define CONST_m1 10000
#define CONST_b 31415821
#define RANGE 2048
static int HashRange;

static int mult(int p, int q)
{
   int p1, p0, q1, q0;

   p1=p/CONST_m1; p0=p%CONST_m1;
   q1=q/CONST_m1; q0=q%CONST_m1;
   return (((p0*q1+p1*q0) % CONST_m1)*CONST_m1+p0*q0);
}

static int mst_random(int seed)
{
  int tmp;
  tmp = (mult(seed,CONST_b)+1);
  return tmp;
}

static int compute_dist(int i,int j, int numvert)
{
  int less, gt;
  if (i<j) {less = i; gt = j;} else {less = j; gt = i;}
  return (mst_random(less*numvert+gt) % RANGE)+1;
}

static int hashfunc(unsigned int key)
{
  return ((key>>4) % HashRange);
}

static void AddEdges(Graph retval, int numvert) 
{
  Vertex src, dest;
  Hash hash;
  int i, j, dist, num_inserted = 0;
  
  for (j = 0; j < numvert; j++)
    {
      src = &(retval->vlist[j]); 
      hash = src->edgehash;

      for (i=0; i<numvert; i++) 
        {
          if (i!=j) 
            {
              dist = compute_dist(i,j,numvert);
              dest = &(retval->vlist[i]);
              HashInsert((void *) dist,(unsigned int) dest,hash);
	      num_inserted++;
            }
        } /* for i */
    } /* for j */

  chatting("%d edges inserted\n", num_inserted);
}

Graph MakeGraph(int numvert) 
{
  int i;
  Vertex vf, vt;
  Graph retval;

  retval = (Graph) malloc (sizeof(*retval));

  chatting("Make phase 1: Creating hash tables\n");
  retval->vlist = (Vertex) malloc (numvert*(sizeof(*vf)));
  vt = NULL;

  for (i = numvert - 1; i >= 0; i--) 
    {
      vf = &(retval->vlist[i]);
      HashRange = numvert/4;
      vf->mindist = 9999999;
      vf->edgehash = MakeHash(HashRange,hashfunc);
      vf->next = vt;
      vt=vf;
    }

  chatting("Make phase 3: Creating graph\n");
  AddEdges(retval, numvert);
  chatting("Make returning\n");
  return retval;
}