home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / graph / _g_misc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  7.2 KB  |  346 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _g_misc.c
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/graph.h>
  16. #include <LEDA/ugraph.h>
  17.  
  18. declare(list,int)
  19.  
  20. declare(node_array,int)
  21.  
  22. node_array(int)* num_ptr;
  23.  
  24. int epe_source_num(edge& e) { return (*num_ptr)[source(e)]; }
  25. int epe_target_num(edge& e) { return (*num_ptr)[target(e)]; }
  26.  
  27. void eliminate_parallel_edges(graph& G)
  28. { // eliminate parallel edges by bucket sort 
  29.  
  30.   list(edge) el = G.all_edges();
  31.   node v;
  32.   edge e;
  33.   int  n = 0;
  34.  
  35.   node_array(int) num(G);
  36.   forall_nodes(v,G) num[v] = n++;
  37.   
  38.   num_ptr = #
  39.  
  40.   el.bucket_sort(0,n-1,&epe_source_num);
  41.   el.bucket_sort(0,n-1,&epe_target_num);
  42.   
  43.   int i = -1;
  44.   int j = -1; 
  45.   forall(e,el)  
  46.     { if (j==num[source(e)] && i==num[target(e)]) 
  47.         G.del_edge(e);
  48.       else 
  49.         { j=num[source(e)];
  50.           i=num[target(e)];
  51.          }
  52.      }
  53.   
  54.  }
  55.  
  56.  
  57. // some special graphs
  58.  
  59. void complete_graph(graph& G, int n)
  60. { node v,w;
  61.   G.clear();
  62.   while (n--) G.new_node();
  63.   forall_node_pairs(v,w,G) G.new_edge(v,w);
  64. }
  65.  
  66. void complete_graph(ugraph& G, int n)
  67. { int i,j;
  68.   node* V = new node[n];
  69.   G.clear();
  70.   for(i=0;i<n;i++) V[i] = G.new_node();
  71.   for(i=0;i<n;i++) 
  72.     for(j=i+1;j<n;j++) 
  73.        G.new_edge(V[i],V[j]);
  74. }
  75.  
  76.  
  77. void random_graph(graph& G, int n, int m)
  78. { /* random graph with n nodes and m edges */ 
  79.  
  80.  int i;
  81.  node* V = new node[n];
  82.  G.clear();
  83.  for(i=0;i<n;i++) V[i] = G.new_node();
  84.  
  85.  init_random();
  86.  while (m--) G.new_edge(V[random(0,n-1)],V[random(0,n-1)]);
  87.  
  88. /*
  89.  int deg = m/n;
  90.  int r = m%n;
  91.  int k;
  92.  for(i=0;i<n;i++)
  93.    for(k=0;k<deg;k++)
  94.       G.new_edge(V[i],V[random(0,n-1)]);
  95.  while (r--) G.new_edge(V[random(0,n-1)],V[random(0,n-1)]);
  96. */
  97.  
  98. }
  99.  
  100. void random_graph(ugraph& G, int n, int m)
  101. { int i;
  102.  node* V = new node[n];
  103.  G.clear();
  104.  for(i=0;i<n;i++) V[i] = G.new_node();
  105.  init_random();
  106.  while (m--) G.new_edge(V[random(0,n-1)],V[random(0,n-1)]);
  107. }
  108.  
  109.  
  110. void random_planar_graph(graph& G, int n)
  111. { G.clear();
  112.  
  113.   edge*  R = new edge[2*n];
  114.   edge*  E = new edge[2*n];
  115.  
  116.   node a = G.new_node();
  117.   node b = G.new_node();
  118.  
  119.   E[3] = G.new_edge(a,b);
  120.   R[3] = G.new_edge(b,a);
  121.  
  122.   for (int i=4; i<2*n; i++)
  123.    { edge e = E[i-1];
  124.      edge r = R[i-1];
  125.  
  126.      a = G.new_node();
  127.  
  128.      E[i] = G.new_edge(a,source(e));
  129.      R[i] = G.new_edge(e,a,after);
  130.  
  131.      i++;
  132.  
  133.      E[i] = G.new_edge(r,a,before);
  134.      R[i] = G.new_edge(a,target(e));
  135.    }
  136.  
  137.  //for(i=3;i<2*n;i++) G.del_edge(R[i]);
  138.  
  139. }
  140.  
  141. void user_graph(graph& G)
  142. { int  n = read_int("|V| = ");
  143.   int  i,j;
  144.  
  145.   node* V = new node[n];
  146.   for(j=0; j<n; j++) V[j] = G.new_node();
  147.  
  148.   for(j=0; j<n; j++) 
  149.   { list(int) il;
  150.     bool ok = false;
  151.     while (!ok)
  152.     { ok = true;
  153.       cout << "edges from [" << j << "] to: ";
  154.       il.read();
  155.       forall(i,il) 
  156.         if (i < 0 || i >= n) 
  157.         { ok=false;
  158.           cout << "illegal node " << i << "\n";
  159.          }
  160.      }
  161.     forall(i,il) G.new_edge(V[j],V[i]);
  162.   }
  163.   G.print();
  164.   if (Yes("save graph ? ")) G.write(read_string("file: "));
  165. }
  166.  
  167.  
  168.  
  169. void test_graph(graph& G)
  170.   G.clear();
  171.   char c;
  172.  
  173.   do c = read_char("graph: f(ile) r(andom) c(omplete) p(lanar) u(ser): ");
  174.   while (c!='f' && c!='r' && c!='c' && c!='p'&& c!='u');   
  175.  
  176.   switch (c) {
  177.  
  178.    case 'f' : { G.read(read_string("file: "));
  179.                 break;
  180.                }
  181.  
  182.    case 'u' : { user_graph(G);
  183.                 break;
  184.                }
  185.  
  186.    case 'c' : { complete_graph(G,read_int("|V| = "));
  187.                 break;
  188.                }
  189.  
  190.    case 'r' : { int n = read_int("|V| = ");
  191.                 int m = read_int("|E| = ");
  192.                 random_graph(G,n,m);
  193.                 break;
  194.                }
  195.  
  196.    case 'p' : { random_planar_graph(G,read_int("|V| = "));
  197.                 break;
  198.                }
  199.    }//switch
  200.  
  201. }
  202.  
  203. void test_graph(ugraph& G)
  204.   G.clear();
  205.   char c;
  206.  
  207.   do c = read_char("graph: f(ile) r(andom) c(omplete) p(lanar) u(ser): ");
  208.   while (c!='f' && c!='r' && c!='c' && c!='p'&& c!='u');   
  209.  
  210.   int  i;
  211.   node v;
  212.   
  213.   switch (c) {
  214.  
  215.   case 'f' : { G.read(read_string("file: "));
  216.                break;
  217.               }
  218.  
  219.    case 'u' : { int  n = read_int("|V| = ");
  220.                 int  j = 0;
  221.                 node* V = new node[n];
  222.                 loop(i,0,n-1) V[i] = G.new_node();
  223.                 forall_nodes(v,G)
  224.                   { list(int) il;
  225.                     cout << "edges from " << j++ << " to: ";
  226.                     il.read();
  227.                     forall(i,il) 
  228.                       if (i >= 0 && i < n) G.new_edge(v,V[i]);
  229.                       else cerr << "illegal node " << i << " (ignored)\n";
  230.                    }
  231.                 G.print();
  232.                 if (Yes("save graph ? ")) G.write(read_string("file: "));
  233.                 break;
  234.                }
  235.  
  236.    case 'c' : { int n = read_int("|V| = ");
  237.                 complete_graph(G,n);
  238.                 break;
  239.                }
  240.  
  241.    case 'r' : { int n = read_int("|V| = ");
  242.                 int m = read_int("|E| = ");
  243.                 random_graph(G,n,m);
  244.                 break;
  245.                }
  246.  
  247.    }//switch
  248.  
  249. }
  250.  
  251.  
  252.  
  253.  
  254.  
  255. void test_bigraph(graph& G, list(node)& A, list(node)& B)
  256. {
  257.   int  a,b,n1,n2;
  258.   char c;
  259.  
  260.   do c = read_char("bipartite graph: f(ile) r(andom) c(omplete) u(ser): ");
  261.   while (c!='f' && c!='r' && c!='c' && c!='u');   
  262.  
  263.   A.clear();
  264.   B.clear();
  265.   G.clear();
  266.  
  267.   if (c!='f') 
  268.    { n1 = read_int("|A| = ");
  269.      n2 = read_int("|B| = ");
  270.     }
  271.   
  272.   
  273.   switch (c) {
  274.  
  275.   case 'f' : { G.read(read_string("file: "));
  276.                node v;
  277.                forall_nodes(v,G) 
  278.                if (G.outdeg(v) > 0) A.append(v);
  279.                else B.append(v);
  280.  
  281.                break;
  282.               }
  283.  
  284.    case 'u' : { node* AV = new node[n1+1];
  285.                 node* BV = new node[n2+1];
  286.  
  287.                 loop(a,1,n1)  A.append(AV[a] = G.new_node());
  288.                 loop(b,1,n2)  B.append(BV[b] = G.new_node());
  289.  
  290.                 loop(a,1,n1)
  291.                   { list(int) il;
  292.                     cout << "edges from " << a << " to: ";
  293.                     il.read();
  294.                     forall(b,il) if (b<=n2) G.new_edge(AV[a],BV[b]);
  295.                                  else break;
  296.                     if (b>n2) break;
  297.                    }
  298.                 break;
  299.                }
  300.  
  301.    case 'c' : { loop(a,1,n1)  A.append(G.new_node());
  302.                 loop(b,1,n2)  B.append(G.new_node());
  303.  
  304.                 node v,w;
  305.  
  306.                 forall(v,A) 
  307.                   forall(w,B) 
  308.                     G.new_edge(v,w);
  309.  
  310.                 break;
  311.                }
  312.  
  313.    case 'r' : { int  m = read_int("|E| = ");
  314.  
  315.                 int  d = m/n1; 
  316.                 int  r = m%n1; 
  317.  
  318.                 node* AV = new node[n1+1];
  319.                 node* BV = new node[n2+1];
  320.  
  321.                 loop(a,1,n1)  A.append(AV[a] = G.new_node());
  322.                 loop(b,1,n2)  B.append(BV[b] = G.new_node());
  323.  
  324.                 node v;
  325.                 int i;
  326.  
  327.                 init_random();
  328.                 forall(v,A)
  329.                   for(i=0;i<d;i++)
  330.                     G.new_edge(v,BV[random(1,n2)]);
  331.  
  332.                 while (r--) G.new_edge(AV[random(1,n1)], BV[random(1,n2)]);
  333.  
  334.  
  335.                 break;
  336.                }
  337.  
  338.        } // switch
  339.  
  340. }
  341.  
  342.  
  343.