# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1239788485 -7200
# Node ID 493533ead9df159b2a1a160663d5aa301fd3711f
# Parent  630c4898c5480faa06857c9aec409042173b0bf7
Bug fix in the Euler iterators (#264)
Handle the case when the first node is isolated.

diff -r 630c4898c548 -r 493533ead9df lemon/euler.h
--- a/lemon/euler.h	Wed Apr 15 07:13:30 2009 +0100
+++ b/lemon/euler.h	Wed Apr 15 11:41:25 2009 +0200
@@ -78,13 +78,19 @@
     DiEulerIt(const GR &gr, typename GR::Node start = INVALID)
       : g(gr), nedge(g)
     {
-      if(start==INVALID) start=NodeIt(g);
-      for(NodeIt n(g);n!=INVALID;++n) nedge[n]=OutArcIt(g,n);
-      while(nedge[start]!=INVALID) {
-        euler.push_back(nedge[start]);
-        Node next=g.target(nedge[start]);
-        ++nedge[start];
-        start=next;
+      if (start==INVALID) {
+        NodeIt n(g);
+        while (n!=INVALID && OutArcIt(g,n)==INVALID) ++n;
+        start=n;
+      }
+      if (start!=INVALID) {
+        for (NodeIt n(g); n!=INVALID; ++n) nedge[n]=OutArcIt(g,n);
+        while (nedge[start]!=INVALID) {
+          euler.push_back(nedge[start]);
+          Node next=g.target(nedge[start]);
+          ++nedge[start];
+          start=next;
+        }
       }
     }
 
@@ -171,15 +177,21 @@
     EulerIt(const GR &gr, typename GR::Node start = INVALID)
       : g(gr), nedge(g), visited(g, false)
     {
-      if(start==INVALID) start=NodeIt(g);
-      for(NodeIt n(g);n!=INVALID;++n) nedge[n]=OutArcIt(g,n);
-      while(nedge[start]!=INVALID) {
-        euler.push_back(nedge[start]);
-        visited[nedge[start]]=true;
-        Node next=g.target(nedge[start]);
-        ++nedge[start];
-        start=next;
-        while(nedge[start]!=INVALID && visited[nedge[start]]) ++nedge[start];
+      if (start==INVALID) {
+        NodeIt n(g);
+        while (n!=INVALID && OutArcIt(g,n)==INVALID) ++n;
+        start=n;
+      }
+      if (start!=INVALID) {
+        for (NodeIt n(g); n!=INVALID; ++n) nedge[n]=OutArcIt(g,n);
+        while(nedge[start]!=INVALID) {
+          euler.push_back(nedge[start]);
+          visited[nedge[start]]=true;
+          Node next=g.target(nedge[start]);
+          ++nedge[start];
+          start=next;
+          while(nedge[start]!=INVALID && visited[nedge[start]]) ++nedge[start];
+        }
       }
     }