00001
00002
00003
00004
00005
00006 #include <cstdio>
00007 #include <cstdlib>
00008 #include <algorithm>
00009
00010 int
00011 main(int argc, char* argv[])
00012 {
00013 if (argc != 5) {
00014 printf("Usage: gen3 <nodenum> <density> <maxweight> <seed>\n");
00015 return -1;
00016 }
00017
00018 int i, j, k;
00019
00020 const int num = atoi(argv[1]);
00021 const double dens = atof(argv[2]);
00022 const int maxw = atoi(argv[3]);
00023 const int seed = atoi(argv[4]);
00024
00025 srand48(seed);
00026
00027 const int maxedgenum = (num*(num-1)) / 2;
00028 int * pick = new int[maxedgenum];
00029 k = 0;
00030 for (i = 0; i < num; ++i) {
00031 for (j = i + 1; j < num; ++j) {
00032 pick[k++] = (i << 16) + j;
00033 }
00034 }
00035
00036 random_shuffle(pick, pick + maxedgenum);
00037 const int edgenum = static_cast<int>(maxedgenum * dens);
00038
00039 printf("%i %i\n", num + 1, num + edgenum);
00040
00041 double *matrix = new double[num * num];
00042 for (i = 0; i < num; ++i)
00043 matrix[i*num+i] = (2*maxw+1)*drand48() - maxw;
00044
00045 for (k = 0; k < edgenum; ++k) {
00046 const int i = pick[k] >> 16;
00047 const int j = pick[k] & 0xffff;
00048 matrix[i*num+j] = matrix[j*num+i] = (2*maxw+1)*drand48() - maxw;
00049 }
00050 for (; k < edgenum; ++k) {
00051 const int i = pick[k] >> 16;
00052 const int j = pick[k] & 0xffff;
00053 matrix[i*num+j] = matrix[j*num+i] = 0.0;
00054 }
00055
00056 for (i = 0; i < num; ++i) {
00057 double sum = 2 * matrix[i*num+i];
00058 for (j = 0; j < i; ++j)
00059 sum += matrix[i*num+j];
00060 for (j = i+1; j < num; ++j)
00061 sum += matrix[i*num+j];
00062 matrix[i*num+i] = sum;
00063 }
00064
00065 for (i = 0; i < num; ++i) {
00066 printf("%3i %3i %i\n", 0, i+1, static_cast<int>(matrix[i*num+i]));
00067 }
00068 for (i = 0; i < num; ++i) {
00069 for (j = i+1; j < num; ++j) {
00070 if (matrix[i*num+j] != 0.0) {
00071 printf("%3i %3i %i\n", i+1,j+1, static_cast<int>(matrix[i*num+j]));
00072 }
00073 }
00074 }
00075
00076 return 0;
00077 }