home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ledar34.zip / leda-r-3_4_tar / LEDA-3.4 / src / graph / _g_generate.c < prev    next >
C/C++ Source or Header  |  1996-09-03  |  11KB  |  490 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA 3.4
  4. +
  5. +  _g_generate.c
  6. +
  7. +  This file is part of the LEDA research version (LEDA-R) that can be 
  8. +  used free of charge in academic research and teaching. Any commercial
  9. +  use of this software requires a license which is distributed by the
  10. +  LEDA Software GmbH, Postfach 151101, 66041 Saarbruecken, FRG
  11. +  (fax +49 681 31104).
  12. +
  13. +  Copyright (c) 1991-1996  by  Max-Planck-Institut fuer Informatik
  14. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  15. +  All rights reserved.
  16. *******************************************************************************/
  17. #include <LEDA/array2.h>
  18. #include <LEDA/graph.h>
  19. #include <LEDA/ugraph.h>
  20. #include <ctype.h>
  21.  
  22. //------------------------------------------------------------------------------
  23. // some graph generators
  24. //
  25. // S. Naeher  (1995)
  26. //------------------------------------------------------------------------------
  27.  
  28. void complete_graph(graph& G, int n, bool directed)
  29.   G.clear();
  30.  
  31.   node* V = new node[n];
  32.  
  33.   for(int i=0;i<n;i++) V[i] = G.new_node();
  34.  
  35.   if (directed)
  36.     { //memory_allocate_block(sizeof(node_struct),n);
  37.       for(int i=0;i<n;i++) 
  38.         for(int j=0;j<n;j++) G.new_edge(V[i],V[j]);
  39.      }
  40.   else
  41.     { //memory_allocate_block(sizeof(edge_struct),n*n/2);
  42.       for(int i=0; i<n; i++) 
  43.         for(int j=i+1; j<n; j++) G.new_edge(V[i],V[j]);
  44.      }
  45.  
  46.   delete[] V;
  47. }
  48.  
  49.  
  50.  
  51. void grid_graph(graph& G, int n) 
  52. { node_array<double> xcoord; 
  53.   node_array<double> ycoord;
  54.   grid_graph(G,xcoord,ycoord,n);
  55.  }
  56.  
  57. void grid_graph(graph& G, node_array<double>& xcoord, 
  58.                           node_array<double>& ycoord, int n) 
  59. {
  60.   array2<node>  A(n,n);
  61.   node v;
  62.   int N = n*n;
  63.   int x;
  64.   int y;
  65.  
  66.   double d = 1.0/(n+1);
  67.  
  68.   G.clear();
  69.  
  70.   xcoord.init(G,N,0);
  71.   ycoord.init(G,N,0);
  72.  
  73.   for(y=0; y<n; y++)
  74.     for(x=0; x<n; x++)
  75.       { A(x,y) = v = G.new_node();
  76.         xcoord[v] = (x+1)*d;
  77.         ycoord[v] = (y+1)*d;
  78.        }
  79.  
  80.   for(x=0; x<n; x++)
  81.     for(y=0; y<n; y++)
  82.        { if (x < n-1) G.new_edge(A(x,y),A(x+1,y));
  83.          if (y < n-1) G.new_edge(A(x,y),A(x,y+1));
  84.         }
  85. }
  86.  
  87.  
  88. void complete_bigraph(graph& G, int n1, int n2, list<node>& A, list<node>& B)
  89. { node v,w;
  90.  
  91.   G.clear();
  92.   //memory_allocate_block(sizeof(node_struct),n1+n2);
  93.   //memory_allocate_block(sizeof(edge_struct),n1*n2);
  94.  
  95.   for(int a=0; a < n1; a++)  A.append(G.new_node());
  96.   for(int b=0; b < n2; b++)  B.append(G.new_node());
  97.  
  98.   forall(v,A) 
  99.   {  forall(w,B) 
  100.        G.new_edge(v,w);
  101.    }
  102.  }
  103.  
  104. void user_graph(graph& G)
  105. { int  n = read_int("|V| = ");
  106.   int  i,j;
  107.  
  108.   node* V = new node[n];
  109.   for(j=0; j<n; j++) V[j] = G.new_node();
  110.  
  111.   for(j=0; j<n; j++) 
  112.   { list<int> il;
  113.     int ok = false;
  114.     while (!ok)
  115.     { ok = true;
  116.       cout << "edges from [" << j << "] to: ";
  117.       il.read();
  118.       forall(i,il) 
  119.         if (i < 0 || i >= n) 
  120.         { ok=false;
  121.           cout << "illegal node " << i << "\n";
  122.          }
  123.      }
  124.     forall(i,il) G.new_edge(V[j],V[i]);
  125.   }
  126.   G.print();
  127.   if (Yes("save graph ? ")) G.write(read_string("file: "));
  128.  
  129.   delete[] V;
  130. }
  131.  
  132.  
  133.  
  134. void test_graph(graph& G)
  135.   G.clear();
  136.   char c;
  137.  
  138.   do c = read_char("graph: f(ile) r(andom) c(omplete) p(lanar) u(ser): ");
  139.   while (c!='f' && c!='r' && c!='c' && c!='p'&& c!='u');   
  140.  
  141.   switch (c) {
  142.  
  143.    case 'f' : { G.read(read_string("file: "));
  144.                 break;
  145.                }
  146.  
  147.    case 'u' : { user_graph(G);
  148.                 break;
  149.                }
  150.  
  151.    case 'c' : { complete_graph(G,read_int("|V| = "));
  152.                 break;
  153.                }
  154.  
  155.    case 'r' : { int n = read_int("|V| = ");
  156.                 int m = read_int("|E| = ");
  157.                 random_graph(G,n,m);
  158.                 break;
  159.                }
  160.  
  161.    case 'p' : { random_planar_graph(G,read_int("|V| = "));
  162.                 break;
  163.                }
  164.    }//switch
  165.  
  166. }
  167.  
  168. void test_ugraph(ugraph& G)
  169.   G.clear();
  170.   char c;
  171.  
  172.   do c = read_char("graph: f(ile) r(andom) c(omplete) p(lanar) u(ser): ");
  173.   while (c!='f' && c!='r' && c!='c' && c!='p'&& c!='u');   
  174.  
  175.   int  i;
  176.   node v;
  177.   
  178.   switch (c) {
  179.  
  180.   case 'f' : { G.read(read_string("file: "));
  181.                break;
  182.               }
  183.  
  184.    case 'u' : { int  n = read_int("|V| = ");
  185.                 int  j = 0;
  186.                 node* V = new node[n];
  187.                 for(i=0; i<n; i++) V[i] = G.new_node();
  188.                 forall_nodes(v,G)
  189.                   { list<int> il;
  190.                     cout << "edges from " << j++ << " to: ";
  191.                     il.read();
  192.                     forall(i,il) 
  193.                       if (i >= 0 && i < n) G.new_edge(v,V[i]);
  194.                       else cerr << "illegal node " << i << " (ignored)\n";
  195.                    }
  196.                 G.print();
  197.                 if (Yes("save graph ? ")) G.write(read_string("file: "));
  198.                 delete[] V;
  199.                 break;
  200.                }
  201.  
  202.    case 'c' : { int n = read_int("|V| = ");
  203.                 complete_graph(G,n);
  204.                 break;
  205.                }
  206.  
  207.    case 'r' : { int n = read_int("|V| = ");
  208.                 int m = read_int("|E| = ");
  209.                 random_graph(G,n,m);
  210.                 break;
  211.                }
  212.  
  213.    }//switch
  214.  
  215. }
  216.  
  217.  
  218.  
  219.  
  220.  
  221. void test_bigraph(graph& G, list<node>& A, list<node>& B)
  222. {
  223.   int  a,b,n1,n2;
  224.   char c;
  225.  
  226.   do c = read_char("bipartite graph: f(ile) r(andom) c(omplete) u(ser): ");
  227.   while (c!='f' && c!='r' && c!='c' && c!='u');   
  228.  
  229.   A.clear();
  230.   B.clear();
  231.   G.clear();
  232.  
  233.   if (c!='f') 
  234.    { n1 = read_int("|A| = ");
  235.      n2 = read_int("|B| = ");
  236.     }
  237.   
  238.   
  239.   switch (c) {
  240.  
  241.   case 'f' : { G.read(read_string("file: "));
  242.                node v;
  243.                forall_nodes(v,G) 
  244.                if (G.outdeg(v) > 0) A.append(v);
  245.                else B.append(v);
  246.  
  247.                break;
  248.               }
  249.  
  250.    case 'u' : { node* AV = new node[n1+1];
  251.                 node* BV = new node[n2+1];
  252.  
  253.                 for(a=1; a<=n1; a++)  A.append(AV[a] = G.new_node());
  254.                 for(b=1; b<=n2; b++)  B.append(BV[b] = G.new_node());
  255.  
  256.                 for(a=1; a<=n1; a++)
  257.                 { list<int> il;
  258.                   cout << "edges from " << a << " to: ";
  259.                   il.read();
  260.                   forall(b,il) 
  261.                     if (b<=n2) G.new_edge(AV[a],BV[b]);
  262.                     else break;
  263.                   if (b>n2) break;
  264.                  }
  265.                 delete[] AV;
  266.                 delete[] BV;
  267.                 break;
  268.                }
  269.  
  270.    case 'c' : complete_bigraph(G,n1,n2,A,B);
  271.               break;
  272.  
  273.    case 'r' : { int m = read_int("|E| = ");
  274.                 random_bigraph(G,n1,n2,m,A,B);
  275.                 break;
  276.                }
  277.  
  278.        } // switch
  279.  
  280. }
  281.  
  282.  
  283.  
  284. void cmdline_graph(graph& G, int argc, char** argv)
  285.   // construct graph from cmdline arguments
  286.  
  287.   if (argc == 1)           // no arguments 
  288.      { test_graph(G);
  289.        return;
  290.       }
  291.   else 
  292.      if (argc == 2)       // one argument
  293.         { if (isdigit(argv[1][0])) 
  294.              { cout << "complete graph |V| = " << argv[1];
  295.                newline;
  296.                newline;
  297.                complete_graph(G,atoi(argv[1]));
  298.               }
  299.           else 
  300.              { cout << "reading graph from file " << argv[1];
  301.                newline;
  302.                newline;
  303.                G.read(argv[1]);
  304.               }
  305.           return;
  306.          }
  307.      else
  308.         if (argc == 3 && isdigit(argv[1][0]) && isdigit(argv[1][0])) 
  309.            { cout << "random graph |V| = " << argv[1] << "  |E| = " << argv[2];
  310.              newline;
  311.              newline;
  312.              random_graph(G,atoi(argv[1]),atoi(argv[2]));
  313.              return;
  314.             }
  315.  
  316.   error_handler(1,"cmdline_graph: illegal arguments");
  317. }
  318.  
  319.  
  320.  
  321.  
  322. //------------------------------------------------------------------------------
  323. // triangulated planar graph
  324. //------------------------------------------------------------------------------
  325.  
  326.  
  327. #include <LEDA/d_array.h>
  328.  
  329.  
  330. class triang_point {
  331.  
  332. public:
  333.  
  334. double x;
  335. double y;
  336.  
  337. LEDA_MEMORY(triang_point)
  338.  
  339. triang_point(double a=0, double b = 0) { x = a; y = b; }
  340. triang_point(const triang_point& p)    { x = p.x; y = p.y; }
  341. ~triang_point() {};
  342.  
  343. bool operator==(const triang_point& p) { return x==p.x && y==p.y; }
  344.  
  345. friend bool right_turn(const triang_point& a, const triang_point& b, const triang_point& c)
  346. { return (a.y-b.y)*(a.x-c.x)+(b.x-a.x)*(a.y-c.y) > 0; }
  347.  
  348. friend bool left_turn(const triang_point& a, const triang_point& b, const triang_point& c)
  349. { return (a.y-b.y)*(a.x-c.x)+(b.x-a.x)*(a.y-c.y) < 0; }
  350.  
  351. };
  352.  
  353. inline int compare(const triang_point& p, const triang_point& q)
  354. { int c = compare(p.x,q.x);
  355.   if (c==0) c = compare(p.y,q.y);
  356.   return c;
  357.  }
  358.  
  359. inline void Print(const triang_point&, ostream&) {}
  360. inline void Read(triang_point&, istream&) {}
  361.  
  362.  
  363.  
  364. #if !defined(__TEMPLATE_FUNCTIONS__)
  365. LEDA_TYPE_PARAMETER(triang_point)
  366. #endif
  367.  
  368.  
  369. void triangulated_planar_graph(graph& G, node_array<double>& xcoord,
  370.                                          node_array<double>& ycoord, int n)
  371.   list<triang_point> L;
  372.   double x;
  373.   double y;
  374.  
  375.   while(n--)
  376.   { rand_int >> x; 
  377.     rand_int >> y;
  378.     L.append(triang_point(x,y));
  379.    }
  380.  
  381.   L.sort();  // sort triang_points lexicographically
  382.  
  383.   list<triang_point> CH;
  384.   list_item last;
  385.   triang_point p,q;
  386.  
  387.  
  388.   // eliminate multiple triang_points
  389.  
  390.   list_item it;
  391.   forall_items(it,L)
  392.   { list_item it1 = L.succ(it);
  393.     while (it1 != nil && L[it1] == L[it])
  394.     { L.del(it1);
  395.       it1 = L.succ(it);
  396.      }
  397.    }
  398.  
  399.   n = L.length();
  400.  
  401.   d_array<triang_point,node> V(nil);
  402.  
  403.   xcoord.init(G,n,0);
  404.   ycoord.init(G,n,0);
  405.  
  406.   forall(q,L) 
  407.   { node v = G.new_node();
  408.     xcoord[v] = q.x;
  409.     ycoord[v] = q.y;
  410.     V[q] = v;
  411.    }
  412.  
  413.  
  414.   // initialize convex hull with first two points
  415.  
  416.   p = L.pop();
  417.   CH.append(p);
  418.  
  419.   while (L.head() == p) L.pop();
  420.   q = L.pop();
  421.   last = CH.append(q);
  422.  
  423.   G.new_edge(V[p],V[q]);
  424.  
  425.  
  426.   // scan remaining points
  427.  
  428.   forall(p,L)
  429.   {
  430.     node v = V[p];
  431.  
  432.     G.new_edge(v,V[CH[last]]);
  433.  
  434.     // compute upper tangent (p,up)
  435.  
  436.     list_item up = last;
  437.     list_item it = CH.cyclic_succ(up);
  438.  
  439.     while (left_turn(CH[it],CH[up],p))
  440.     { up = it;
  441.       it = CH.cyclic_succ(up);
  442.       G.new_edge(v,V[CH[up]]);
  443.      }
  444.  
  445.  
  446.     // compute lower tangent (p,low)
  447.  
  448.     list_item low = last;
  449.     it = CH.cyclic_pred(low);
  450.  
  451.     while (right_turn(CH[it],CH[low],p))
  452.     { low = it;
  453.       it = CH.cyclic_pred(low);
  454.       G.new_edge(v,V[CH[low]]);
  455.      }
  456.  
  457.  
  458.     // remove all points between up and low
  459.  
  460.     if (up != low)
  461.     { it = CH.cyclic_succ(low);
  462.  
  463.       while (it != up)
  464.       { CH.del(it);
  465.         it = CH.cyclic_succ(low);
  466.        }
  467.      }
  468.  
  469.     // insert new point
  470.  
  471.     last = CH.insert(p,low);
  472.  
  473.    }
  474.  
  475. }
  476.  
  477. void triangulated_planar_graph(graph& G, int m)
  478. { node_array<double> xcoord;
  479.   node_array<double> ycoord;
  480.   triangulated_planar_graph(G,xcoord,ycoord,m);
  481.  }
  482.  
  483.  
  484.