[Lemon-commits] [lemon_svn] beckerjc: r469 - hugo/trunk/src/work/johanna

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:39:37 CET 2006


Author: beckerjc
Date: Sat Apr 17 21:34:43 2004
New Revision: 469

Added:
   hugo/trunk/src/work/johanna/ma_order.h
   hugo/trunk/src/work/johanna/ma_order_test.cc
Modified:
   hugo/trunk/src/work/johanna/   (props changed)
   hugo/trunk/src/work/johanna/Makefile

Log:
Maximum Adjacency Ordering (beta)


Modified: hugo/trunk/src/work/johanna/Makefile
==============================================================================
--- hugo/trunk/src/work/johanna/Makefile	(original)
+++ hugo/trunk/src/work/johanna/Makefile	Sat Apr 17 21:34:43 2004
@@ -1,4 +1,4 @@
-BINARIES = kruskal_test
+BINARIES = kruskal_test ma_order_test
 INCLUDEDIRS= -I. -I.. -I../../include -I../{marci,jacint,alpar,klao,akos}
 include ../makefile
 

Added: hugo/trunk/src/work/johanna/ma_order.h
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/johanna/ma_order.h	Sat Apr 17 21:34:43 2004
@@ -0,0 +1,87 @@
+// -*- C++ -*- //
+
+#ifndef HUGO_MA_ORDER_H
+#define HUGO_MA_ORDER_H
+
+#include <vector>
+#include <functional>
+#include <bin_heap.h>
+
+namespace hugo {
+
+  template <typename Graph, 
+	    typename Heap = BinHeap<typename Graph::Node, int, 
+				    typename Graph::NodeMap<int>, 
+				    std::greater<int> >,
+	    typename OrderVect = std::vector<typename Graph::Node> >
+  class MAOrder {
+
+    typedef typename Graph::Node Node;
+    typedef typename Graph::NodeIt NodeIt;
+    typedef typename Graph::Edge Edge;
+    typedef typename Graph::OutEdgeIt OutEdgeIt;
+    typedef typename Graph::NodeMap<int> NodeMapInt;
+
+    const Graph& G;
+
+    OrderVect& order;
+
+
+  public:
+    
+    MAOrder(const Graph& _G, OrderVect& _order) : G(_G), order(_order) {}
+
+    void run()
+    {
+      Node first;
+      G.first(first);
+      run(first);
+    }
+
+    void run(Node first)
+    {
+      NodeMapInt heapMap(G, -1);
+      Heap heap(heapMap);
+      
+      heap.push(first, 0);
+
+      NodeIt n;
+      G.first(n);
+      while ( G.valid(n) ) {
+
+	while(!heap.empty()) {
+	  Node a = heap.top();
+	  heap.pop();
+	  order.push_back(a);
+
+	  OutEdgeIt e;
+	  G.first(e,a);
+	  for (;G.valid(e);G.next(e)) {
+	    Node v = G.head(e); // hmm
+	    if (heap.state(v) == Heap::IN_HEAP ) {
+	      heap.decrease(v, heap[v]+1);
+	    }
+	    else if (heap.state(v) == Heap::PRE_HEAP) {
+	      heap.push(v, 1);
+	    }
+	  }
+
+	}
+
+	while( G.valid(n) ) {
+	  if (heap.state(n) == Heap::PRE_HEAP) {
+	    heap.push(n,0);
+	    break;
+	  }
+	  G.next(n);
+	}
+      }
+
+    }
+
+
+  };
+
+} // namespace hugo
+
+#endif // HUGO_MA_ORDER_H

Added: hugo/trunk/src/work/johanna/ma_order_test.cc
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/johanna/ma_order_test.cc	Sat Apr 17 21:34:43 2004
@@ -0,0 +1,57 @@
+#include <string>
+#include <iostream>
+#include <map>
+#include <vector>
+
+#include <ma_order.h>
+#include <list_graph.h>
+
+
+using namespace std;
+using namespace hugo;
+
+int main() {
+
+  typedef ListGraph::Node Node;
+  typedef ListGraph::Edge Edge;
+  typedef ListGraph::NodeIt NodeIt;
+  typedef ListGraph::EdgeIt EdgeIt;
+
+  ListGraph G;
+
+  Node v3=G.addNode();
+  Node v5=G.addNode();
+  Node v2=G.addNode();
+  Node v0=G.addNode();
+  Node v4=G.addNode();
+  Node v1=G.addNode();
+  
+  G.addEdge(v0, v1);G.addEdge(v0, v1);G.addEdge(v0, v1);
+  G.addEdge(v0, v2);
+  G.addEdge(v0, v3);G.addEdge(v0, v3);
+  G.addEdge(v1, v2);G.addEdge(v1, v2);
+  G.addEdge(v2, v4);
+  G.addEdge(v3, v4);
+  G.addEdge(v4, v5);
+
+  G.addEdge(v1, v0);G.addEdge(v1, v0);G.addEdge(v1, v0);
+  G.addEdge(v2, v0);
+  G.addEdge(v3, v0);G.addEdge(v3, v0);
+  G.addEdge(v2, v1);G.addEdge(v2, v1);
+  G.addEdge(v4, v2);
+  G.addEdge(v4, v3);
+  G.addEdge(v5, v4);
+
+
+  vector<Node> ma_order;
+  MAOrder<ListGraph>  mao(G,ma_order);
+  mao.run(v0);
+  vector<Node>::iterator i;
+  for (i = ma_order.begin(); i!=ma_order.end(); ++i) {
+    cout << *i << " ";
+  }
+  cout << endl;
+  cout << v0 << " " << v1 << " " << v2 << " " << v3 << " " << v4 << " "
+       << v5 << endl;
+
+}



More information about the Lemon-commits mailing list