[Lemon-commits] [lemon_svn] ladanyi: r877 - hugo/trunk/doc

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


Author: ladanyi
Date: Fri May 28 09:48:16 2004
New Revision: 877

Added:
   hugo/trunk/doc/graphs.dox
Modified:
   hugo/trunk/doc/Doxyfile
   hugo/trunk/doc/mainpage.dox

Log:
Added a short tutorial on using graphs.

Modified: hugo/trunk/doc/Doxyfile
==============================================================================
--- hugo/trunk/doc/Doxyfile	(original)
+++ hugo/trunk/doc/Doxyfile	Fri May 28 09:48:16 2004
@@ -392,6 +392,7 @@
 # with spaces.
 
 INPUT                  = mainpage.dox \
+			 graphs.dox \
                          maps.dox coding_style.dox \
                          groups.dox \
                          ../src/hugo \

Added: hugo/trunk/doc/graphs.dox
==============================================================================
--- (empty file)
+++ hugo/trunk/doc/graphs.dox	Fri May 28 09:48:16 2004
@@ -0,0 +1,145 @@
+/*!
+
+\page graphs How to use graphs
+
+The following program demonstrates the basic features of HugoLib's graph
+structures.
+
+\code
+#include <iostream>
+#include <hugo/list_graph.h>
+
+using namespace hugo;
+
+int main()
+{
+  typedef ListGraph Graph;
+\endcode
+
+ListGraph is one of HugoLib's graph classes. It is based on linked lists,
+therefore iterating throuh its edges and nodes is fast.
+
+\code
+  typedef Graph::Edge Edge;
+  typedef Graph::InEdgeIt InEdgeIt;
+  typedef Graph::OutEdgeIt OutEdgeIt;
+  typedef Graph::EdgeIt EdgeIt;
+  typedef Graph::Node Node;
+  typedef Graph::NodeIt NodeIt;
+
+  Graph g;
+  
+  for (int i = 0; i < 3; i++)
+    g.addNode();
+  
+  for (NodeIt i(g); g.valid(i); g.next(i))
+    for (NodeIt j(g); g.valid(j); g.next(j))
+      if (i != j) g.addEdge(i, j);
+\endcode
+
+After some convenience typedefs we create a graph and add three nodes to it.
+Then we add edges to it to form a full graph.
+
+\code
+  std::cout << "Nodes:";
+  for (NodeIt i(g); g.valid(i); g.next(i))
+    std::cout << " " << g.id(i);
+  std::cout << std::endl;
+\endcode
+
+Here we iterate through all nodes of the graph. We use a constructor of the
+node iterator to initialize it to the first node. The next member function is
+used to step to the next node, and valid is used to check if we have passed the
+last one.
+
+\code
+  std::cout << "Nodes:";
+  NodeIt n;
+  for (g.first(n); n != INVALID; g.next(n))
+    std::cout << " " << g.id(n);
+  std::cout << std::endl;
+\endcode
+
+Here you can see an alternative way to iterate through all nodes. Here we use a
+member function of the graph to initialize the node iterator to the first node
+of the graph. Using next on the iterator pointing to the last node invalidates
+the iterator i.e. sets its value to INVALID. Checking for this value is
+equivalent to using the valid member function.
+
+Both of the previous code fragments print out the same:
+
+\code
+Nodes: 2 1 0
+\endcode
+
+\code
+  std::cout << "Edges:";
+  for (EdgeIt i(g); g.valid(i); g.next(i))
+    std::cout << " (" << g.id(g.tail(i)) << "," << g.id(g.head(i)) << ")";
+  std::cout << std::endl;
+\endcode
+
+\code
+Edges: (0,2) (1,2) (0,1) (2,1) (1,0) (2,0)
+\endcode
+
+We can also iterate through all edges of the graph very similarly. The head and
+tail member functions can be used to access the endpoints of an edge.
+
+\code
+  NodeIt first_node(g);
+
+  std::cout << "Out-edges of node " << g.id(first_node) << ":";
+  for (OutEdgeIt i(g, first_node); g.valid(i); g.next(i))
+    std::cout << " (" << g.id(g.tail(i)) << "," << g.id(g.head(i)) << ")"; 
+  std::cout << std::endl;
+
+  std::cout << "In-edges of node " << g.id(first_node) << ":";
+  for (InEdgeIt i(g, first_node); g.valid(i); g.next(i))
+    std::cout << " (" << g.id(g.tail(i)) << "," << g.id(g.head(i)) << ")"; 
+  std::cout << std::endl;
+\endcode
+
+\code
+Out-edges of node 2: (2,0) (2,1)
+In-edges of node 2: (0,2) (1,2)
+\endcode
+
+We can also iterate through the in and out-edges of a node. In the above
+example we print out the in and out-edges of the first node of the graph.
+
+\code
+  Graph::EdgeMap<int> m(g);
+
+  for (EdgeIt e(g); g.valid(e); g.next(e))
+    m.set(e, 10 - g.id(e));
+  
+  std::cout << "Id Edge  Value" << std::endl;
+  for (EdgeIt e(g); g.valid(e); g.next(e))
+    std::cout << g.id(e) << "  (" << g.id(g.tail(e)) << "," << g.id(g.head(e))
+      << ") " << m[e] << std::endl;
+\endcode
+
+\code
+Id Edge  Value
+4  (0,2) 6
+2  (1,2) 8
+5  (0,1) 5
+0  (2,1) 10
+3  (1,0) 7
+1  (2,0) 9
+\endcode
+
+In generic graph optimization programming graphs are not containers rather
+incidence structures which are iterable in many ways. HugoLib introduces
+concepts that allow us to attach containers to graphs. These containers are
+called maps.
+
+In the example above we create an EdgeMap which assigns an int value to all
+edges of the graph. We use the set member function of the map to write values
+into the map and the operator[] to retrieve them.
+
+Here we used the maps provided by the ListGraph class, but you can also write
+your own maps. You can read more about using maps \ref maps "here".
+
+*/

Modified: hugo/trunk/doc/mainpage.dox
==============================================================================
--- hugo/trunk/doc/mainpage.dox	(original)
+++ hugo/trunk/doc/mainpage.dox	Fri May 28 09:48:16 2004
@@ -1,6 +1,23 @@
 /**
 \mainpage
 
-Please make a better mainpage (doc/mainpage.dox).
+\section intro Introduction
 
-*/
\ No newline at end of file
+\subsection whatis What is HugoLib
+
+HugoLib stands for Hungarian Graph Optimization Library. It is a C++ template
+library aimed at combinatorial optimization tasks which often involve working
+with graphs. As the name also suggests, its development was started by
+Hungarian people.
+
+\subsection howtoread How to read this document
+
+If you are new to HugoLib, you probably should start \ref graphs "here".
+You can also find this page along with other under Related Pages (left-hand
+side frame).
+
+If you are more interested in details about data structures and algorithms then
+you should browse the reference manual part of the documentation. The Modules
+section is a good starting point for this.
+
+*/



More information about the Lemon-commits mailing list