⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glpdmx.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 2 页
字号:
            memcpy((char *)a->data + a_cap, &cap, sizeof(double));         if (a_cost >= 0)            memcpy((char *)a->data + a_cost, &cost, sizeof(double));         end_of_line(csa);      }      xprintf("%d lines were read\n", csa->count);done: if (ret) glp_erase_graph(G, G->v_size, G->a_size);      if (csa->fp != NULL) xfclose(csa->fp);      if (flag != NULL) xfree(flag);      return ret;}/************************************************************************  NAME**  glp_write_mincost - write min-cost flow problem data in DIMACS format**  SYNOPSIS**  int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap,*     int a_cost, const char *fname);**  DESCRIPTION**  The routine glp_write_mincost writes minimum cost flow problem data*  in DIMACS format to a text file.**  RETURNS**  If the operation was successful, the routine returns zero. Otherwise*  it prints an error message and returns non-zero. */int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap,      int a_cost, const char *fname){     XFILE *fp;      glp_vertex *v;      glp_arc *a;      int i, count = 0, ret;      double rhs, low, cap, cost;      if (v_rhs >= 0 && v_rhs > G->v_size - (int)sizeof(double))         xerror("glp_write_mincost: v_rhs = %d; invalid offset\n",            v_rhs);      if (a_low >= 0 && a_low > G->a_size - (int)sizeof(double))         xerror("glp_write_mincost: a_low = %d; invalid offset\n",            a_low);      if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double))         xerror("glp_write_mincost: a_cap = %d; invalid offset\n",            a_cap);      if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double))         xerror("glp_write_mincost: a_cost = %d; invalid offset\n",            a_cost);      xprintf("Writing min-cost flow problem data to `%s'...\n",         fname);      fp = xfopen(fname, "w");      if (fp == NULL)      {  xprintf("Unable to create `%s' - %s\n", fname, xerrmsg());         ret = 1;         goto done;      }      xfprintf(fp, "c %s\n",         G->name == NULL ? "unknown" : G->name), count++;      xfprintf(fp, "p min %d %d\n", G->nv, G->na), count++;      if (v_rhs >= 0)      {  for (i = 1; i <= G->nv; i++)         {  v = G->v[i];            memcpy(&rhs, (char *)v->data + v_rhs, sizeof(double));            if (rhs != 0.0)               xfprintf(fp, "n %d %.*g\n", i, DBL_DIG, rhs), count++;         }      }      for (i = 1; i <= G->nv; i++)      {  v = G->v[i];         for (a = v->out; a != NULL; a = a->t_next)         {  if (a_low >= 0)               memcpy(&low, (char *)a->data + a_low, sizeof(double));            else               low = 0.0;            if (a_cap >= 0)               memcpy(&cap, (char *)a->data + a_cap, sizeof(double));            else               cap = 1.0;            if (a_cost >= 0)               memcpy(&cost, (char *)a->data + a_cost, sizeof(double));            else               cost = 0.0;            xfprintf(fp, "a %d %d %.*g %.*g %.*g\n",               a->tail->i, a->head->i, DBL_DIG, low, DBL_DIG, cap,               DBL_DIG, cost), count++;         }      }      xfprintf(fp, "c eof\n"), count++;      xfflush(fp);      if (xferror(fp))      {  xprintf("Write error on `%s' - %s\n", fname, xerrmsg());         ret = 1;         goto done;      }      xprintf("%d lines were written\n", count);      ret = 0;done: if (fp != NULL) xfclose(fp);      return ret;}/************************************************************************  NAME**  glp_read_maxflow - read maximum flow problem data in DIMACS format**  SYNOPSIS**  int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap,*     const char *fname);**  DESCRIPTION**  The routine glp_read_maxflow reads maximum flow problem data in*  DIMACS format from a text file.**  RETURNS**  If the operation was successful, the routine returns zero. Otherwise*  it prints an error message and returns non-zero. */int glp_read_maxflow(glp_graph *G, int *_s, int *_t, int a_cap,      const char *fname){     struct csa _csa, *csa = &_csa;      glp_arc *a;      int i, j, k, s, t, nv, na, ret = 0;      double cap;      if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double))         xerror("glp_read_maxflow: a_cap = %d; invalid offset\n",            a_cap);      glp_erase_graph(G, G->v_size, G->a_size);      if (setjmp(csa->jump))      {  ret = 1;         goto done;      }      csa->fname = fname;      csa->fp = NULL;      csa->count = 0;      csa->c = '\n';      csa->field[0] = '\0';      csa->empty = csa->nonint = 0;      xprintf("Reading maximum flow problem data from `%s'...\n",         fname);      csa->fp = xfopen(fname, "r");      if (csa->fp == NULL)      {  xprintf("Unable to open `%s' - %s\n", fname, xerrmsg());         longjmp(csa->jump, 1);      }      /* read problem line */      read_designator(csa);      if (strcmp(csa->field, "p") != 0)         error(csa, "problem line missing or invalid");      read_field(csa);      if (strcmp(csa->field, "max") != 0)         error(csa, "wrong problem designator; `max' expected");      read_field(csa);      if (!(str2int(csa->field, &nv) == 0 && nv >= 2))         error(csa, "number of nodes missing or invalid");      read_field(csa);      if (!(str2int(csa->field, &na) == 0 && na >= 0))         error(csa, "number of arcs missing or invalid");      xprintf("Flow network has %d node%s and %d arc%s\n",         nv, nv == 1 ? "" : "s", na, na == 1 ? "" : "s");      if (nv > 0) glp_add_vertices(G, nv);      end_of_line(csa);      /* read node descriptor lines */      s = t = 0;      for (;;)      {  read_designator(csa);         if (strcmp(csa->field, "n") != 0) break;         read_field(csa);         if (str2int(csa->field, &i) != 0)            error(csa, "node number missing or invalid");         if (!(1 <= i && i <= nv))            error(csa, "node number %d out of range", i);         read_field(csa);         if (strcmp(csa->field, "s") == 0)         {  if (s > 0)               error(csa, "only one source node allowed");            s = i;         }         else if (strcmp(csa->field, "t") == 0)         {  if (t > 0)               error(csa, "only one sink node allowed");            t = i;         }         else            error(csa, "wrong node designator; `s' or `t' expected");         if (s > 0 && s == t)            error(csa, "source and sink nodes must be distinct");         end_of_line(csa);      }      if (s == 0)         error(csa, "source node descriptor missing\n");      if (t == 0)         error(csa, "sink node descriptor missing\n");      if (_s != NULL) *_s = s;      if (_t != NULL) *_t = t;      /* read arc descriptor lines */      for (k = 1; k <= na; k++)      {  if (k > 1) read_designator(csa);         if (strcmp(csa->field, "a") != 0)            error(csa, "wrong line designator; `a' expected");         read_field(csa);         if (str2int(csa->field, &i) != 0)            error(csa, "starting node number missing or invalid");         if (!(1 <= i && i <= nv))            error(csa, "starting node number %d out of range", i);         read_field(csa);         if (str2int(csa->field, &j) != 0)            error(csa, "ending node number missing or invalid");         if (!(1 <= j && j <= nv))            error(csa, "ending node number %d out of range", j);         read_field(csa);         if (!(str2num(csa->field, &cap) == 0 && cap >= 0.0))            error(csa, "arc capacity missing or invalid");         check_int(csa, cap);         a = glp_add_arc(G, i, j);         if (a_cap >= 0)            memcpy((char *)a->data + a_cap, &cap, sizeof(double));         end_of_line(csa);      }      xprintf("%d lines were read\n", csa->count);done: if (ret) glp_erase_graph(G, G->v_size, G->a_size);      if (csa->fp != NULL) xfclose(csa->fp);      return ret;}/************************************************************************  NAME**  glp_write_maxflow - write maximum flow problem data in DIMACS format**  SYNOPSIS**  int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap,*     const char *fname);**  DESCRIPTION**  The routine glp_write_maxflow writes maximum flow problem data in*  DIMACS format to a text file.**  RETURNS**  If the operation was successful, the routine returns zero. Otherwise*  it prints an error message and returns non-zero. */int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap,      const char *fname){     XFILE *fp;      glp_vertex *v;      glp_arc *a;      int i, count = 0, ret;      double cap;      if (!(1 <= s && s <= G->nv))         xerror("glp_write_maxflow: s = %d; source node number out of r"            "ange\n", s);      if (!(1 <= t && t <= G->nv))         xerror("glp_write_maxflow: t = %d: sink node number out of ran"            "ge\n", t);      if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double))         xerror("glp_write_mincost: a_cap = %d; invalid offset\n",            a_cap);      xprintf("Writing maximum flow problem data to `%s'...\n",         fname);      fp = xfopen(fname, "w");      if (fp == NULL)      {  xprintf("Unable to create `%s' - %s\n", fname, xerrmsg());         ret = 1;         goto done;      }      xfprintf(fp, "c %s\n",         G->name == NULL ? "unknown" : G->name), count++;      xfprintf(fp, "p max %d %d\n", G->nv, G->na), count++;      xfprintf(fp, "n %d s\n", s), count++;      xfprintf(fp, "n %d t\n", t), count++;      for (i = 1; i <= G->nv; i++)      {  v = G->v[i];         for (a = v->out; a != NULL; a = a->t_next)         {  if (a_cap >= 0)               memcpy(&cap, (char *)a->data + a_cap, sizeof(double));            else               cap = 1.0;            xfprintf(fp, "a %d %d %.*g\n",               a->tail->i, a->head->i, DBL_DIG, cap), count++;         }      }      xfprintf(fp, "c eof\n"), count++;      xfflush(fp);      if (xferror(fp))      {  xprintf("Write error on `%s' - %s\n", fname, xerrmsg());         ret = 1;         goto done;      }      xprintf("%d lines were written\n", count);      ret = 0;done: if (fp != NULL) xfclose(fp);      return ret;}/* eof */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -