_g_inout.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _g_inout.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/graph.h>
  12. #include <fstream.h>
  13. //--------------------------------------------------------------------------
  14. // graph i/o
  15. //--------------------------------------------------------------------------
  16. /*
  17. static void put_int(filebuf& fb, int n)
  18. { char* A = (char*)&n;
  19.   char* E = A+sizeof(int);
  20.   while (A<E) fb.sputc(*(A++));
  21. }
  22. static int get_int(istream& from)
  23. { int n;
  24.   char* A = (char*)&n;
  25.   char* E = A+sizeof(int);
  26.   while (A<E) from.get(*(A++));
  27.   return n;
  28. }
  29. */
  30. void graph::write(string file_name) const
  31. { ofstream out(file_name);
  32.   if (out.fail()) error_handler(1,"write: cannot open file");
  33.   write(out);
  34. }
  35. void graph::write(ostream& out) const
  36. {
  37.   int* A = new int[max_n_index+2];
  38.   // nodes get numbers from 1 to |V| (trouble with 0)
  39.   int count = 1;
  40.   out << "LEDA.GRAPHn";
  41.   out << node_type() << "n";
  42.   out << edge_type() << "n";
  43.  
  44.   out << V.length() << "n";
  45.   node v;
  46.   forall_nodes(v,*this)
  47.   { write_node_entry(out,v->data[0]);
  48.     out << endl;
  49.     A[v->name] = count++;
  50.    }
  51.   out << E.length() << "n";
  52.   edge e;
  53.   forall_edges(e,*this)
  54.   { out << A[e->s->name] << " " << A[e->t->name] << " ";
  55.     write_edge_entry(out,e->data[0]);
  56.     out << endl;
  57.    }
  58. delete A;
  59. }
  60. int graph::read(string file_name)
  61. { ifstream in(file_name);
  62.   if (in.fail())  return 1;
  63.   return read(in);
  64. }
  65. int graph::read(istream& in)
  66. { int result = 0;
  67.   clear();
  68.   edge e;
  69.   int n,i,v,w;
  70.   string d_type,n_type,e_type;
  71.   string this_n_type = node_type();
  72.   string this_e_type = edge_type();
  73.   while (in && d_type=="") in >> d_type;
  74.   in >> n_type >> e_type >> n;
  75.   if (d_type != "LEDA.GRAPH") return 3;
  76.   read_line(in);
  77.   node* A = new node[n+1];
  78.   // since Type_Name currently does not work for user defined types
  79.   // (produces the string "unknown") we allow "unknown" to match
  80.   // any node_type 
  81.   if (this_n_type != "unknown" && n_type != this_n_type)
  82.   { if (this_n_type != "void") result = 2;   // incompatible node types
  83.     for (i=1; i<=n; i++)
  84.     { A[i] = new_node();
  85.       read_line(in);
  86.      }
  87.    }
  88.   else
  89.     for (i=1; i<=n; i++)
  90.     { A[i] = new_node(0);
  91.       read_node_entry(in,A[i]->data[0]);
  92.      }
  93.  
  94.   in >> n;       // number of edges
  95.   if (this_e_type != "unknown" && e_type != this_e_type)   // see above remark
  96.   { if (this_e_type != "void") result = 2;   // incompatible edge types
  97.     while (n--) { in >> v >> w;
  98.                   e = new_edge(A[v],A[w]);
  99.                   read_line(in);
  100.                  }
  101.    }
  102.   else
  103.    while (n--) { in >> v >> w;
  104.                  e = new_edge(A[v],A[w],0);
  105.                  read_edge_entry(in,e->data[0]);
  106.                 }
  107.   delete A;
  108.   return result;
  109. }
  110. void graph::print_node(node v,ostream& o) const
  111. { if (super() != 0)
  112.      super()->print_node(node(graph::inf(v)),o);
  113.   else
  114.      { o << "[" << index(v) <<"]" ;
  115.        print_node_entry(o,v->data[0]);
  116.       }
  117. }
  118. void graph::print_edge(edge e,ostream& o) const
  119. { if (super() != 0)
  120.      super()->print_edge(edge(graph::inf(e)),o);
  121.   else
  122.      { o <<   "[" << e->s->name << "]";
  123.        o <<  ((undirected) ? "==" : "--");
  124.        print_edge_entry(o,e->data[0]);
  125.        o <<  ((undirected) ? "==" : "-->");
  126.        o << "[" << e->t->name << "]";
  127.       }
  128. }
  129. void graph::print(string s, ostream& out) const
  130. { node v;
  131.   edge e;
  132.   out << s << endl;
  133.   forall_nodes(v,*this)
  134.   { print_node(v,out);
  135.     out << " : ";
  136.     forall_adj_edges(e,v) print_edge(e,out);
  137.     out << endl;
  138.    }
  139.   out << endl;
  140. }