gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 11 0
merge default
3 files changed:
↑ Collapse diff ↑
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup demos
20 20
///\file
21 21
///\brief Demonstrating graph input and output
22 22
///
23 23
/// This program gives an example of how to read and write a digraph
24 24
/// and additional maps from/to a stream or a file using the
25 25
/// \ref lgf-format "LGF" format.
26 26
///
27 27
/// The \c "digraph.lgf" file:
28 28
/// \include digraph.lgf
29 29
///
30 30
/// And the program which reads it and prints the digraph to the
31 31
/// standard output:
32 32
/// \include lgf_demo.cc
33 33

	
34 34
#include <iostream>
35 35
#include <lemon/smart_graph.h>
36 36
#include <lemon/lgf_reader.h>
37 37
#include <lemon/lgf_writer.h>
38 38

	
39 39
using namespace lemon;
40 40

	
41 41
int main() {
42 42
  SmartDigraph g;
43 43
  SmartDigraph::ArcMap<int> cap(g);
44 44
  SmartDigraph::Node s, t;
45 45

	
46 46
  try {
47 47
    digraphReader(g, "digraph.lgf"). // read the directed graph into g
48 48
      arcMap("capacity", cap).       // read the 'capacity' arc map into cap
49 49
      node("source", s).             // read 'source' node to s
50 50
      node("target", t).             // read 'target' node to t
51 51
      run();
52
  } catch (DataFormatError& error) { // check if there was any error
52
  } catch (Exception& error) { // check if there was any error
53 53
    std::cerr << "Error: " << error.what() << std::endl;
54 54
    return -1;
55 55
  }
56 56

	
57 57
  std::cout << "A digraph is read from 'digraph.lgf'." << std::endl;
58 58
  std::cout << "Number of nodes: " << countNodes(g) << std::endl;
59 59
  std::cout << "Number of arcs: " << countArcs(g) << std::endl;
60 60

	
61 61
  std::cout << "We can write it to the standard output:" << std::endl;
62 62

	
63 63
  digraphWriter(g).                // write g to the standard output
64 64
    arcMap("capacity", cap).       // write cap into 'capacity'
65 65
    node("source", s).             // write s to 'source'
66 66
    node("target", t).             // write t to 'target'
67 67
    run();
68 68

	
69 69
  return 0;
70 70
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ARG_PARSER_H
20 20
#define LEMON_ARG_PARSER_H
21 21

	
22 22
#include <vector>
23 23
#include <map>
24 24
#include <list>
25 25
#include <string>
26 26
#include <iostream>
27 27
#include <sstream>
28 28
#include <algorithm>
29 29
#include <lemon/assert.h>
30 30

	
31 31
///\ingroup misc
32 32
///\file
33 33
///\brief A tool to parse command line arguments.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Command line arguments parser
38 38

	
39 39
  ///\ingroup misc
40 40
  ///Command line arguments parser.
41 41
  ///
42 42
  ///For a complete example see the \ref arg_parser_demo.cc demo file.
43 43
  class ArgParser {
44 44

	
45 45
    static void _showHelp(void *p);
46 46
  protected:
47 47

	
48 48
    int _argc;
49 49
    const char **_argv;
50 50

	
51 51
    enum OptType { UNKNOWN=0, BOOL=1, STRING=2, DOUBLE=3, INTEGER=4, FUNC=5 };
52 52

	
53 53
    class ParData {
54 54
    public:
55 55
      union {
56 56
        bool *bool_p;
57 57
        int *int_p;
58 58
        double *double_p;
59 59
        std::string *string_p;
60 60
        struct {
61 61
          void (*p)(void *);
62 62
          void *data;
63 63
        } func_p;
64 64

	
65 65
      };
66 66
      std::string help;
67 67
      bool mandatory;
68 68
      OptType type;
69 69
      bool set;
70 70
      bool ingroup;
71 71
      bool has_syn;
72 72
      bool syn;
73 73
      bool self_delete;
74 74
      ParData() : mandatory(false), type(UNKNOWN), set(false), ingroup(false),
75 75
                  has_syn(false), syn(false), self_delete(false) {}
76 76
    };
77 77

	
78 78
    typedef std::map<std::string,ParData> Opts;
79 79
    Opts _opts;
80 80

	
81 81
    class GroupData
82 82
    {
83 83
    public:
84 84
      typedef std::list<std::string> Opts;
85 85
      Opts opts;
86 86
      bool only_one;
87 87
      bool mandatory;
88 88
      GroupData() :only_one(false), mandatory(false) {}
89 89
    };
90 90

	
91 91
    typedef std::map<std::string,GroupData> Groups;
92 92
    Groups _groups;
93 93

	
94 94
    struct OtherArg
95 95
    {
96 96
      std::string name;
97 97
      std::string help;
98 98
      OtherArg(std::string n, std::string h) :name(n), help(h) {}
99 99

	
100 100
    };
101 101

	
102 102
    std::vector<OtherArg> _others_help;
103 103
    std::vector<std::string> _file_args;
104 104
    std::string _command_name;
105 105

	
106 106

	
107 107
  private:
108 108
    //Bind a function to an option.
109 109

	
110 110
    //\param name The name of the option. The leading '-' must be omitted.
111 111
    //\param help A help string.
112 112
    //\retval func The function to be called when the option is given. It
113 113
    //  must be of type "void f(void *)"
114 114
    //\param data Data to be passed to \c func
115 115
    ArgParser &funcOption(const std::string &name,
116 116
                    const std::string &help,
117 117
                    void (*func)(void *),void *data);
118 118

	
119 119
  public:
120 120

	
121 121
    ///Constructor
122 122
    ArgParser(int argc, const char **argv);
123 123

	
124 124
    ~ArgParser();
125 125

	
126 126
    ///\name Options
127 127
    ///
128 128

	
129 129
    ///@{
130 130

	
131 131
    ///Add a new integer type option
132 132

	
133 133
    ///Add a new integer type option.
134 134
    ///\param name The name of the option. The leading '-' must be omitted.
135 135
    ///\param help A help string.
136 136
    ///\param value A default value for the option.
137 137
    ///\param obl Indicate if the option is mandatory.
138 138
    ArgParser &intOption(const std::string &name,
139 139
                    const std::string &help,
140 140
                    int value=0, bool obl=false);
141 141

	
142 142
    ///Add a new floating point type option
143 143

	
144 144
    ///Add a new floating point type option.
145 145
    ///\param name The name of the option. The leading '-' must be omitted.
146 146
    ///\param help A help string.
147 147
    ///\param value A default value for the option.
148 148
    ///\param obl Indicate if the option is mandatory.
149 149
    ArgParser &doubleOption(const std::string &name,
150 150
                      const std::string &help,
151 151
                      double value=0, bool obl=false);
152 152

	
153 153
    ///Add a new bool type option
154 154

	
155 155
    ///Add a new bool type option.
156 156
    ///\param name The name of the option. The leading '-' must be omitted.
157 157
    ///\param help A help string.
158 158
    ///\param value A default value for the option.
159 159
    ///\param obl Indicate if the option is mandatory.
160 160
    ///\note A mandatory bool obtion is of very little use.
161 161
    ArgParser &boolOption(const std::string &name,
162 162
                      const std::string &help,
163 163
                      bool value=false, bool obl=false);
164 164

	
165 165
    ///Add a new string type option
166 166

	
167 167
    ///Add a new string type option.
168 168
    ///\param name The name of the option. The leading '-' must be omitted.
169 169
    ///\param help A help string.
170 170
    ///\param value A default value for the option.
171 171
    ///\param obl Indicate if the option is mandatory.
172 172
    ArgParser &stringOption(const std::string &name,
173 173
                      const std::string &help,
174 174
                      std::string value="", bool obl=false);
175 175

	
176 176
    ///Give help string for non-parsed arguments.
177 177

	
178 178
    ///With this function you can give help string for non-parsed arguments.
179 179
    ///The parameter \c name will be printed in the short usage line, while
180 180
    ///\c help gives a more detailed description.
181 181
    ArgParser &other(const std::string &name,
182 182
                     const std::string &help="");
183 183

	
184 184
    ///@}
185 185

	
186 186
    ///\name Options with External Storage
187 187
    ///Using this functions, the value of the option will be directly written
188 188
    ///into a variable once the option appears in the command line.
189 189

	
190 190
    ///@{
191 191

	
192 192
    ///Add a new integer type option with a storage reference
193 193

	
194 194
    ///Add a new integer type option with a storage reference.
195 195
    ///\param name The name of the option. The leading '-' must be omitted.
196 196
    ///\param help A help string.
197 197
    ///\param obl Indicate if the option is mandatory.
198 198
    ///\retval ref The value of the argument will be written to this variable.
199 199
    ArgParser &refOption(const std::string &name,
200 200
                    const std::string &help,
201 201
                    int &ref, bool obl=false);
202 202

	
203 203
    ///Add a new floating type option with a storage reference
204 204

	
205 205
    ///Add a new floating type option with a storage reference.
206 206
    ///\param name The name of the option. The leading '-' must be omitted.
207 207
    ///\param help A help string.
208 208
    ///\param obl Indicate if the option is mandatory.
209 209
    ///\retval ref The value of the argument will be written to this variable.
210 210
    ArgParser &refOption(const std::string &name,
211 211
                      const std::string &help,
212 212
                      double &ref, bool obl=false);
213 213

	
214 214
    ///Add a new bool type option with a storage reference
215 215

	
216 216
    ///Add a new bool type option with a storage reference.
217 217
    ///\param name The name of the option. The leading '-' must be omitted.
218 218
    ///\param help A help string.
219 219
    ///\param obl Indicate if the option is mandatory.
220 220
    ///\retval ref The value of the argument will be written to this variable.
221 221
    ///\note A mandatory bool obtion is of very little use.
222 222
    ArgParser &refOption(const std::string &name,
223 223
                      const std::string &help,
224 224
                      bool &ref, bool obl=false);
225 225

	
226 226
    ///Add a new string type option with a storage reference
227 227

	
228 228
    ///Add a new string type option with a storage reference.
229 229
    ///\param name The name of the option. The leading '-' must be omitted.
230 230
    ///\param help A help string.
231 231
    ///\param obl Indicate if the option is mandatory.
232 232
    ///\retval ref The value of the argument will be written to this variable.
233 233
    ArgParser &refOption(const std::string &name,
234 234
                      const std::string &help,
235 235
                      std::string &ref, bool obl=false);
236 236

	
237 237
    ///@}
238 238

	
239 239
    ///\name Option Groups and Synonyms
240 240
    ///
241 241

	
242 242
    ///@{
243 243

	
244 244
    ///Bundle some options into a group
245 245

	
246 246
    /// You can group some option by calling this function repeatedly for each
247 247
    /// option to be grouped with the same groupname.
248 248
    ///\param group The group name.
249 249
    ///\param opt The option name.
250 250
    ArgParser &optionGroup(const std::string &group,
251 251
                           const std::string &opt);
252 252

	
253 253
    ///Make the members of a group exclusive
254 254

	
255 255
    ///If you call this function for a group, than at most one of them can be
256 256
    ///given at the same time.
257 257
    ArgParser &onlyOneGroup(const std::string &group);
258 258

	
259 259
    ///Make a group mandatory
260 260

	
261 261
    ///Using this function, at least one of the members of \c group
262 262
    ///must be given.
263 263
    ArgParser &mandatoryGroup(const std::string &group);
264 264

	
265 265
    ///Create synonym to an option
266 266

	
267 267
    ///With this function you can create a synonym \c syn of the
268 268
    ///option \c opt.
269 269
    ArgParser &synonym(const std::string &syn,
270 270
                           const std::string &opt);
271 271

	
272 272
    ///@}
273 273

	
274 274
  private:
275 275
    void show(std::ostream &os,Opts::const_iterator i) const;
276 276
    void show(std::ostream &os,Groups::const_iterator i) const;
277 277
    void showHelp(Opts::const_iterator i) const;
278 278
    void showHelp(std::vector<OtherArg>::const_iterator i) const;
279 279

	
280 280
    void unknownOpt(std::string arg) const;
281 281

	
282 282
    void requiresValue(std::string arg, OptType t) const;
283 283
    void checkMandatories() const;
284 284

	
285 285
    void shortHelp() const;
286 286
    void showHelp() const;
287 287
  public:
288 288

	
289 289
    ///Start the parsing process
290 290
    ArgParser &parse();
291 291

	
292 292
    /// Synonym for parse()
293 293
    ArgParser &run()
294 294
    {
295 295
      return parse();
296 296
    }
297 297

	
298 298
    ///Give back the command name (the 0th argument)
299 299
    const std::string &commandName() const { return _command_name; }
300 300

	
301 301
    ///Check if an opion has been given to the command.
302 302
    bool given(std::string op) const
303 303
    {
304 304
      Opts::const_iterator i = _opts.find(op);
305 305
      return i!=_opts.end()?i->second.set:false;
306 306
    }
307 307

	
308 308

	
309 309
    ///Magic type for operator[]
310 310

	
311 311
    ///This is the type of the return value of ArgParser::operator[]().
312 312
    ///It automatically converts to \c int, \c double, \c bool or
313
    ///\c std::string if the type of the option matches, otherwise it
314
    ///throws an exception (i.e. it performs runtime type checking).
313
    ///\c std::string if the type of the option matches, which is checked
314
    ///with an \ref LEMON_ASSERT "assertion" (i.e. it performs runtime
315
    ///type checking).
315 316
    class RefType
316 317
    {
317 318
      const ArgParser &_parser;
318 319
      std::string _name;
319 320
    public:
320 321
      ///\e
321 322
      RefType(const ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
322 323
      ///\e
323 324
      operator bool()
324 325
      {
325 326
        Opts::const_iterator i = _parser._opts.find(_name);
326 327
        LEMON_ASSERT(i!=_parser._opts.end(),
327 328
                     std::string()+"Unkown option: '"+_name+"'");
328 329
        LEMON_ASSERT(i->second.type==ArgParser::BOOL,
329 330
                     std::string()+"'"+_name+"' is a bool option");
330 331
        return *(i->second.bool_p);
331 332
      }
332 333
      ///\e
333 334
      operator std::string()
334 335
      {
335 336
        Opts::const_iterator i = _parser._opts.find(_name);
336 337
        LEMON_ASSERT(i!=_parser._opts.end(),
337 338
                     std::string()+"Unkown option: '"+_name+"'");
338 339
        LEMON_ASSERT(i->second.type==ArgParser::STRING,
339 340
                     std::string()+"'"+_name+"' is a string option");
340 341
        return *(i->second.string_p);
341 342
      }
342 343
      ///\e
343 344
      operator double()
344 345
      {
345 346
        Opts::const_iterator i = _parser._opts.find(_name);
346 347
        LEMON_ASSERT(i!=_parser._opts.end(),
347 348
                     std::string()+"Unkown option: '"+_name+"'");
348 349
        LEMON_ASSERT(i->second.type==ArgParser::DOUBLE ||
349 350
                     i->second.type==ArgParser::INTEGER,
350 351
                     std::string()+"'"+_name+"' is a floating point option");
351 352
        return i->second.type==ArgParser::DOUBLE ?
352 353
          *(i->second.double_p) : *(i->second.int_p);
353 354
      }
354 355
      ///\e
355 356
      operator int()
356 357
      {
357 358
        Opts::const_iterator i = _parser._opts.find(_name);
358 359
        LEMON_ASSERT(i!=_parser._opts.end(),
359 360
                     std::string()+"Unkown option: '"+_name+"'");
360 361
        LEMON_ASSERT(i->second.type==ArgParser::INTEGER,
361 362
                     std::string()+"'"+_name+"' is an integer option");
362 363
        return *(i->second.int_p);
363 364
      }
364 365

	
365 366
    };
366 367

	
367 368
    ///Give back the value of an option
368 369

	
369 370
    ///Give back the value of an option.
370 371
    ///\sa RefType
371 372
    RefType operator[](const std::string &n) const
372 373
    {
373 374
      return RefType(*this, n);
374 375
    }
375 376

	
376 377
    ///Give back the non-option type arguments.
377 378

	
378 379
    ///Give back a reference to a vector consisting of the program arguments
379 380
    ///not starting with a '-' character.
380 381
    const std::vector<std::string> &files() const { return _file_args; }
381 382

	
382 383
  };
383 384
}
384 385

	
385 386
#endif // LEMON_ARG_PARSER_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ASSERT_H
20 20
#define LEMON_ASSERT_H
21 21

	
22 22
/// \ingroup exceptions
23 23
/// \file
24 24
/// \brief Extended assertion handling
25 25

	
26 26
#include <lemon/error.h>
27 27

	
28 28
namespace lemon {
29 29

	
30 30
  inline void assert_fail_abort(const char *file, int line,
31 31
                                const char *function, const char* message,
32 32
                                const char *assertion)
33 33
  {
34 34
    std::cerr << file << ":" << line << ": ";
35 35
    if (function)
36 36
      std::cerr << function << ": ";
37 37
    std::cerr << message;
38 38
    if (assertion)
39 39
      std::cerr << " (assertion '" << assertion << "' failed)";
40 40
    std::cerr << std::endl;
41 41
    std::abort();
42 42
  }
43 43

	
44 44
  namespace _assert_bits {
45 45

	
46 46

	
47 47
    inline const char* cstringify(const std::string& str) {
48 48
      return str.c_str();
49 49
    }
50 50

	
51 51
    inline const char* cstringify(const char* str) {
52 52
      return str;
53 53
    }
54 54
  }
55 55
}
56 56

	
57 57
#endif // LEMON_ASSERT_H
58 58

	
59 59
#undef LEMON_ASSERT
60 60
#undef LEMON_DEBUG
61 61

	
62 62
#if (defined(LEMON_ASSERT_ABORT) ? 1 : 0) +               \
63 63
  (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1
64 64
#error "LEMON assertion system is not set properly"
65 65
#endif
66 66

	
67 67
#if ((defined(LEMON_ASSERT_ABORT) ? 1 : 0) +            \
68 68
     (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 ||     \
69 69
     defined(LEMON_ENABLE_ASSERTS)) &&                  \
70 70
  (defined(LEMON_DISABLE_ASSERTS) ||                    \
71 71
   defined(NDEBUG))
72 72
#error "LEMON assertion system is not set properly"
73 73
#endif
74 74

	
75 75

	
76 76
#if defined LEMON_ASSERT_ABORT
77 77
#  undef LEMON_ASSERT_HANDLER
78 78
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
79 79
#elif defined LEMON_ASSERT_CUSTOM
80 80
#  undef LEMON_ASSERT_HANDLER
81 81
#  ifndef LEMON_CUSTOM_ASSERT_HANDLER
82 82
#    error "LEMON_CUSTOM_ASSERT_HANDLER is not set"
83 83
#  endif
84 84
#  define LEMON_ASSERT_HANDLER LEMON_CUSTOM_ASSERT_HANDLER
85 85
#elif defined LEMON_DISABLE_ASSERTS
86 86
#  undef LEMON_ASSERT_HANDLER
87 87
#elif defined NDEBUG
88 88
#  undef LEMON_ASSERT_HANDLER
89 89
#else
90 90
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
91 91
#endif
92 92

	
93 93
#ifndef LEMON_FUNCTION_NAME
94 94
#  if defined __GNUC__
95 95
#    define LEMON_FUNCTION_NAME (__PRETTY_FUNCTION__)
96 96
#  elif defined _MSC_VER
97 97
#    define LEMON_FUNCTION_NAME (__FUNCSIG__)
98 98
#  elif __STDC_VERSION__ >= 199901L
99 99
#    define LEMON_FUNCTION_NAME (__func__)
100 100
#  else
101 101
#    define LEMON_FUNCTION_NAME ("<unknown>")
102 102
#  endif
103 103
#endif
104 104

	
105 105
#ifdef DOXYGEN
106 106

	
107 107
/// \ingroup exceptions
108 108
///
109 109
/// \brief Macro for assertion with customizable message
110 110
///
111
/// Macro for assertion with customizable message.  
111
/// Macro for assertion with customizable message.
112 112
/// \param exp An expression that must be convertible to \c bool.  If it is \c
113 113
/// false, then an assertion is raised. The concrete behaviour depends on the
114 114
/// settings of the assertion system.
115 115
/// \param msg A <tt>const char*</tt> parameter, which can be used to provide
116 116
/// information about the circumstances of the failed assertion.
117 117
///
118 118
/// The assertions are enabled in the default behaviour.
119 119
/// You can disable them with the following code:
120 120
/// \code
121 121
/// #define LEMON_DISABLE_ASSERTS
122 122
/// \endcode
123 123
/// or with compilation parameters:
124 124
/// \code
125 125
/// g++ -DLEMON_DISABLE_ASSERTS
126 126
/// make CXXFLAGS='-DLEMON_DISABLE_ASSERTS'
127 127
/// \endcode
128 128
/// The checking is also disabled when the standard macro \c NDEBUG is defined.
129 129
///
130 130
/// As a default behaviour the failed assertion prints a short log message to
131 131
/// the standard error and aborts the execution.
132 132
///
133 133
/// However, the following modes can be used in the assertion system:
134 134
/// - \c LEMON_ASSERT_ABORT The failed assertion prints a short log message to
135 135
///   the standard error and aborts the program. It is the default behaviour.
136 136
/// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler
137 137
///   function.
138 138
///   \code
139 139
///     void custom_assert_handler(const char* file, int line,
140 140
///                                const char* function, const char* message,
141 141
///                                const char* assertion);
142 142
///   \endcode
143 143
///   The name of the function should be defined as the \c
144 144
///   LEMON_CUSTOM_ASSERT_HANDLER macro name.
145 145
///   \code
146 146
///     #define LEMON_CUSTOM_ASSERT_HANDLER custom_assert_handler
147 147
///   \endcode
148 148
///   Whenever an assertion is occured, the custom assertion
149 149
///   handler is called with appropiate parameters.
150 150
///
151 151
/// The assertion mode can also be changed within one compilation unit.
152 152
/// If the macros are redefined with other settings and the
153 153
/// \ref lemon/assert.h "assert.h" file is reincluded, then the
154 154
/// behaviour is changed appropiately to the new settings.
155 155
#  define LEMON_ASSERT(exp, msg)                                        \
156 156
  (static_cast<void> (!!(exp) ? 0 : (                                   \
157 157
    LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                            \
158 158
                         LEMON_FUNCTION_NAME,                           \
159 159
                         ::lemon::_assert_bits::cstringify(msg), #exp), 0)))
160 160

	
161 161
/// \ingroup exceptions
162 162
///
163 163
/// \brief Macro for internal assertions
164 164
///
165 165
/// Macro for internal assertions, it is used in the library to check
166 166
/// the consistency of results of algorithms, several pre- and
167 167
/// postconditions and invariants. The checking is disabled by
168 168
/// default, but it can be turned on with the macro \c
169 169
/// LEMON_ENABLE_DEBUG.
170 170
/// \code
171 171
/// #define LEMON_ENABLE_DEBUG
172 172
/// \endcode
173 173
/// or with compilation parameters:
174 174
/// \code
175 175
/// g++ -DLEMON_ENABLE_DEBUG
176 176
/// make CXXFLAGS='-DLEMON_ENABLE_DEBUG'
177 177
/// \endcode
178 178
///
179 179
/// This macro works like the \c LEMON_ASSERT macro, therefore the
180 180
/// current behaviour depends on the settings of \c LEMON_ASSERT
181 181
/// macro.
182 182
///
183 183
/// \see LEMON_ASSERT
184 184
#  define LEMON_DEBUG(exp, msg)                                         \
185 185
  (static_cast<void> (!!(exp) ? 0 : (                                   \
186 186
    LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                            \
187 187
                         LEMON_FUNCTION_NAME,                           \
188 188
                         ::lemon::_assert_bits::cstringify(msg), #exp), 0)))
189 189

	
190 190
#else
191 191

	
192 192
#  ifndef LEMON_ASSERT_HANDLER
193 193
#    define LEMON_ASSERT(exp, msg)  (static_cast<void>(0))
194 194
#    define LEMON_DEBUG(exp, msg) (static_cast<void>(0))
195 195
#  else
196 196
#    define LEMON_ASSERT(exp, msg)                                      \
197 197
       (static_cast<void> (!!(exp) ? 0 : (                              \
198 198
        LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                        \
199 199
                             LEMON_FUNCTION_NAME,                       \
200 200
                             ::lemon::_assert_bits::cstringify(msg),    \
201 201
                             #exp), 0)))
202 202
#    if LEMON_ENABLE_DEBUG
203 203
#      define LEMON_DEBUG(exp, msg)                                     \
204 204
         (static_cast<void> (!!(exp) ? 0 : (                            \
205 205
           LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                     \
206 206
                                LEMON_FUNCTION_NAME,                    \
207 207
                                ::lemon::_assert_bits::cstringify(msg), \
208 208
                                #exp), 0)))
209 209
#    else
210 210
#      define LEMON_DEBUG(exp, msg) (static_cast<void>(0))
211 211
#    endif
212 212
#  endif
213 213

	
214 214
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief BFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50 50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \ref PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
66 66
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 67
    ///Instantiates a \ref ProcessedMap.
68 68

	
69 69
    ///This function instantiates a \ref ProcessedMap.
70 70
    ///\param g is the digraph, to which
71 71
    ///we would like to define the \ref ProcessedMap
72 72
#ifdef DOXYGEN
73 73
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 74
#else
75 75
    static ProcessedMap *createProcessedMap(const Digraph &)
76 76
#endif
77 77
    {
78 78
      return new ProcessedMap();
79 79
    }
80 80

	
81 81
    ///The type of the map that indicates which nodes are reached.
82 82

	
83 83
    ///The type of the map that indicates which nodes are reached.
84 84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 85
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 86
    ///Instantiates a \ref ReachedMap.
87 87

	
88 88
    ///This function instantiates a \ref ReachedMap.
89 89
    ///\param g is the digraph, to which
90 90
    ///we would like to define the \ref ReachedMap.
91 91
    static ReachedMap *createReachedMap(const Digraph &g)
92 92
    {
93 93
      return new ReachedMap(g);
94 94
    }
95 95

	
96 96
    ///The type of the map that stores the distances of the nodes.
97 97

	
98 98
    ///The type of the map that stores the distances of the nodes.
99 99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100 100
    typedef typename Digraph::template NodeMap<int> DistMap;
101 101
    ///Instantiates a \ref DistMap.
102 102

	
103 103
    ///This function instantiates a \ref DistMap.
104 104
    ///\param g is the digraph, to which we would like to define the
105 105
    ///\ref DistMap.
106 106
    static DistMap *createDistMap(const Digraph &g)
107 107
    {
108 108
      return new DistMap(g);
109 109
    }
110 110
  };
111 111

	
112 112
  ///%BFS algorithm class.
113 113

	
114 114
  ///\ingroup search
115 115
  ///This class provides an efficient implementation of the %BFS algorithm.
116 116
  ///
117 117
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 118
  ///algorithm, which is convenient in the simplier cases and it can be
119 119
  ///used easier.
120 120
  ///
121 121
  ///\tparam GR The type of the digraph the algorithm runs on.
122 122
  ///The default value is \ref ListDigraph. The value of GR is not used
123 123
  ///directly by \ref Bfs, it is only passed to \ref BfsDefaultTraits.
124 124
  ///\tparam TR Traits class to set various data types used by the algorithm.
125 125
  ///The default traits class is
126 126
  ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
127 127
  ///See \ref BfsDefaultTraits for the documentation of
128 128
  ///a Bfs traits class.
129 129
#ifdef DOXYGEN
130 130
  template <typename GR,
131 131
            typename TR>
132 132
#else
133 133
  template <typename GR=ListDigraph,
134 134
            typename TR=BfsDefaultTraits<GR> >
135 135
#endif
136 136
  class Bfs {
137 137
  public:
138
    ///\ref Exception for uninitialized parameters.
139

	
140
    ///This error represents problems in the initialization of the
141
    ///parameters of the algorithm.
142
    class UninitializedParameter : public lemon::UninitializedParameter {
143
    public:
144
      virtual const char* what() const throw() {
145
        return "lemon::Bfs::UninitializedParameter";
146
      }
147
    };
148 138

	
149 139
    ///The type of the digraph the algorithm runs on.
150 140
    typedef typename TR::Digraph Digraph;
151 141

	
152 142
    ///\brief The type of the map that stores the predecessor arcs of the
153 143
    ///shortest paths.
154 144
    typedef typename TR::PredMap PredMap;
155 145
    ///The type of the map that stores the distances of the nodes.
156 146
    typedef typename TR::DistMap DistMap;
157 147
    ///The type of the map that indicates which nodes are reached.
158 148
    typedef typename TR::ReachedMap ReachedMap;
159 149
    ///The type of the map that indicates which nodes are processed.
160 150
    typedef typename TR::ProcessedMap ProcessedMap;
161 151
    ///The type of the paths.
162 152
    typedef PredMapPath<Digraph, PredMap> Path;
163 153

	
164 154
    ///The traits class.
165 155
    typedef TR Traits;
166 156

	
167 157
  private:
168 158

	
169 159
    typedef typename Digraph::Node Node;
170 160
    typedef typename Digraph::NodeIt NodeIt;
171 161
    typedef typename Digraph::Arc Arc;
172 162
    typedef typename Digraph::OutArcIt OutArcIt;
173 163

	
174 164
    //Pointer to the underlying digraph.
175 165
    const Digraph *G;
176 166
    //Pointer to the map of predecessor arcs.
177 167
    PredMap *_pred;
178 168
    //Indicates if _pred is locally allocated (true) or not.
179 169
    bool local_pred;
180 170
    //Pointer to the map of distances.
181 171
    DistMap *_dist;
182 172
    //Indicates if _dist is locally allocated (true) or not.
183 173
    bool local_dist;
184 174
    //Pointer to the map of reached status of the nodes.
185 175
    ReachedMap *_reached;
186 176
    //Indicates if _reached is locally allocated (true) or not.
187 177
    bool local_reached;
188 178
    //Pointer to the map of processed status of the nodes.
189 179
    ProcessedMap *_processed;
190 180
    //Indicates if _processed is locally allocated (true) or not.
191 181
    bool local_processed;
192 182

	
193 183
    std::vector<typename Digraph::Node> _queue;
194 184
    int _queue_head,_queue_tail,_queue_next_dist;
195 185
    int _curr_dist;
196 186

	
197 187
    //Creates the maps if necessary.
198 188
    void create_maps()
199 189
    {
200 190
      if(!_pred) {
201 191
        local_pred = true;
202 192
        _pred = Traits::createPredMap(*G);
203 193
      }
204 194
      if(!_dist) {
205 195
        local_dist = true;
206 196
        _dist = Traits::createDistMap(*G);
207 197
      }
208 198
      if(!_reached) {
209 199
        local_reached = true;
210 200
        _reached = Traits::createReachedMap(*G);
211 201
      }
212 202
      if(!_processed) {
213 203
        local_processed = true;
214 204
        _processed = Traits::createProcessedMap(*G);
215 205
      }
216 206
    }
217 207

	
218 208
  protected:
219 209

	
220 210
    Bfs() {}
221 211

	
222 212
  public:
223 213

	
224 214
    typedef Bfs Create;
225 215

	
226 216
    ///\name Named template parameters
227 217

	
228 218
    ///@{
229 219

	
230 220
    template <class T>
231 221
    struct SetPredMapTraits : public Traits {
232 222
      typedef T PredMap;
233 223
      static PredMap *createPredMap(const Digraph &)
234 224
      {
235
        throw UninitializedParameter();
225
        LEMON_ASSERT(false, "PredMap is not initialized");
226
        return 0; // ignore warnings
236 227
      }
237 228
    };
238 229
    ///\brief \ref named-templ-param "Named parameter" for setting
239 230
    ///\ref PredMap type.
240 231
    ///
241 232
    ///\ref named-templ-param "Named parameter" for setting
242 233
    ///\ref PredMap type.
243 234
    template <class T>
244 235
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
245 236
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
246 237
    };
247 238

	
248 239
    template <class T>
249 240
    struct SetDistMapTraits : public Traits {
250 241
      typedef T DistMap;
251 242
      static DistMap *createDistMap(const Digraph &)
252 243
      {
253
        throw UninitializedParameter();
244
        LEMON_ASSERT(false, "DistMap is not initialized");
245
        return 0; // ignore warnings
254 246
      }
255 247
    };
256 248
    ///\brief \ref named-templ-param "Named parameter" for setting
257 249
    ///\ref DistMap type.
258 250
    ///
259 251
    ///\ref named-templ-param "Named parameter" for setting
260 252
    ///\ref DistMap type.
261 253
    template <class T>
262 254
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
263 255
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
264 256
    };
265 257

	
266 258
    template <class T>
267 259
    struct SetReachedMapTraits : public Traits {
268 260
      typedef T ReachedMap;
269 261
      static ReachedMap *createReachedMap(const Digraph &)
270 262
      {
271
        throw UninitializedParameter();
263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264
        return 0; // ignore warnings
272 265
      }
273 266
    };
274 267
    ///\brief \ref named-templ-param "Named parameter" for setting
275 268
    ///\ref ReachedMap type.
276 269
    ///
277 270
    ///\ref named-templ-param "Named parameter" for setting
278 271
    ///\ref ReachedMap type.
279 272
    template <class T>
280 273
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
281 274
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
282 275
    };
283 276

	
284 277
    template <class T>
285 278
    struct SetProcessedMapTraits : public Traits {
286 279
      typedef T ProcessedMap;
287 280
      static ProcessedMap *createProcessedMap(const Digraph &)
288 281
      {
289
        throw UninitializedParameter();
282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283
        return 0; // ignore warnings
290 284
      }
291 285
    };
292 286
    ///\brief \ref named-templ-param "Named parameter" for setting
293 287
    ///\ref ProcessedMap type.
294 288
    ///
295 289
    ///\ref named-templ-param "Named parameter" for setting
296 290
    ///\ref ProcessedMap type.
297 291
    template <class T>
298 292
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
299 293
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
300 294
    };
301 295

	
302 296
    struct SetStandardProcessedMapTraits : public Traits {
303 297
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
304 298
      static ProcessedMap *createProcessedMap(const Digraph &g)
305 299
      {
306 300
        return new ProcessedMap(g);
301
        return 0; // ignore warnings
307 302
      }
308 303
    };
309 304
    ///\brief \ref named-templ-param "Named parameter" for setting
310 305
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
311 306
    ///
312 307
    ///\ref named-templ-param "Named parameter" for setting
313 308
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
314 309
    ///If you don't set it explicitly, it will be automatically allocated.
315 310
    struct SetStandardProcessedMap :
316 311
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
317 312
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
318 313
    };
319 314

	
320 315
    ///@}
321 316

	
322 317
  public:
323 318

	
324 319
    ///Constructor.
325 320

	
326 321
    ///Constructor.
327 322
    ///\param g The digraph the algorithm runs on.
328 323
    Bfs(const Digraph &g) :
329 324
      G(&g),
330 325
      _pred(NULL), local_pred(false),
331 326
      _dist(NULL), local_dist(false),
332 327
      _reached(NULL), local_reached(false),
333 328
      _processed(NULL), local_processed(false)
334 329
    { }
335 330

	
336 331
    ///Destructor.
337 332
    ~Bfs()
338 333
    {
339 334
      if(local_pred) delete _pred;
340 335
      if(local_dist) delete _dist;
341 336
      if(local_reached) delete _reached;
342 337
      if(local_processed) delete _processed;
343 338
    }
344 339

	
345 340
    ///Sets the map that stores the predecessor arcs.
346 341

	
347 342
    ///Sets the map that stores the predecessor arcs.
348 343
    ///If you don't use this function before calling \ref run(),
349 344
    ///it will allocate one. The destructor deallocates this
350 345
    ///automatically allocated map, of course.
351 346
    ///\return <tt> (*this) </tt>
352 347
    Bfs &predMap(PredMap &m)
353 348
    {
354 349
      if(local_pred) {
355 350
        delete _pred;
356 351
        local_pred=false;
357 352
      }
358 353
      _pred = &m;
359 354
      return *this;
360 355
    }
361 356

	
362 357
    ///Sets the map that indicates which nodes are reached.
363 358

	
364 359
    ///Sets the map that indicates which nodes are reached.
365 360
    ///If you don't use this function before calling \ref run(),
366 361
    ///it will allocate one. The destructor deallocates this
367 362
    ///automatically allocated map, of course.
368 363
    ///\return <tt> (*this) </tt>
369 364
    Bfs &reachedMap(ReachedMap &m)
370 365
    {
371 366
      if(local_reached) {
372 367
        delete _reached;
373 368
        local_reached=false;
374 369
      }
375 370
      _reached = &m;
376 371
      return *this;
377 372
    }
378 373

	
379 374
    ///Sets the map that indicates which nodes are processed.
380 375

	
381 376
    ///Sets the map that indicates which nodes are processed.
382 377
    ///If you don't use this function before calling \ref run(),
383 378
    ///it will allocate one. The destructor deallocates this
384 379
    ///automatically allocated map, of course.
385 380
    ///\return <tt> (*this) </tt>
386 381
    Bfs &processedMap(ProcessedMap &m)
387 382
    {
388 383
      if(local_processed) {
389 384
        delete _processed;
390 385
        local_processed=false;
391 386
      }
392 387
      _processed = &m;
393 388
      return *this;
394 389
    }
395 390

	
396 391
    ///Sets the map that stores the distances of the nodes.
397 392

	
398 393
    ///Sets the map that stores the distances of the nodes calculated by
399 394
    ///the algorithm.
400 395
    ///If you don't use this function before calling \ref run(),
401 396
    ///it will allocate one. The destructor deallocates this
402 397
    ///automatically allocated map, of course.
403 398
    ///\return <tt> (*this) </tt>
404 399
    Bfs &distMap(DistMap &m)
405 400
    {
406 401
      if(local_dist) {
407 402
        delete _dist;
408 403
        local_dist=false;
409 404
      }
410 405
      _dist = &m;
411 406
      return *this;
412 407
    }
413 408

	
414 409
  public:
415 410

	
416 411
    ///\name Execution control
417 412
    ///The simplest way to execute the algorithm is to use
418 413
    ///one of the member functions called \ref lemon::Bfs::run() "run()".
419 414
    ///\n
420 415
    ///If you need more control on the execution, first you must call
421 416
    ///\ref lemon::Bfs::init() "init()", then you can add several source
422 417
    ///nodes with \ref lemon::Bfs::addSource() "addSource()".
423 418
    ///Finally \ref lemon::Bfs::start() "start()" will perform the
424 419
    ///actual path computation.
425 420

	
426 421
    ///@{
427 422

	
428 423
    ///Initializes the internal data structures.
429 424

	
430 425
    ///Initializes the internal data structures.
431 426
    ///
432 427
    void init()
433 428
    {
434 429
      create_maps();
435 430
      _queue.resize(countNodes(*G));
436 431
      _queue_head=_queue_tail=0;
437 432
      _curr_dist=1;
438 433
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
439 434
        _pred->set(u,INVALID);
440 435
        _reached->set(u,false);
441 436
        _processed->set(u,false);
442 437
      }
443 438
    }
444 439

	
445 440
    ///Adds a new source node.
446 441

	
447 442
    ///Adds a new source node to the set of nodes to be processed.
448 443
    ///
449 444
    void addSource(Node s)
450 445
    {
451 446
      if(!(*_reached)[s])
452 447
        {
453 448
          _reached->set(s,true);
454 449
          _pred->set(s,INVALID);
455 450
          _dist->set(s,0);
456 451
          _queue[_queue_head++]=s;
457 452
          _queue_next_dist=_queue_head;
458 453
        }
459 454
    }
460 455

	
461 456
    ///Processes the next node.
462 457

	
463 458
    ///Processes the next node.
464 459
    ///
465 460
    ///\return The processed node.
466 461
    ///
467 462
    ///\pre The queue must not be empty.
468 463
    Node processNextNode()
469 464
    {
470 465
      if(_queue_tail==_queue_next_dist) {
471 466
        _curr_dist++;
472 467
        _queue_next_dist=_queue_head;
473 468
      }
474 469
      Node n=_queue[_queue_tail++];
475 470
      _processed->set(n,true);
476 471
      Node m;
477 472
      for(OutArcIt e(*G,n);e!=INVALID;++e)
478 473
        if(!(*_reached)[m=G->target(e)]) {
479 474
          _queue[_queue_head++]=m;
480 475
          _reached->set(m,true);
481 476
          _pred->set(m,e);
482 477
          _dist->set(m,_curr_dist);
483 478
        }
484 479
      return n;
485 480
    }
486 481

	
487 482
    ///Processes the next node.
488 483

	
489 484
    ///Processes the next node and checks if the given target node
490 485
    ///is reached. If the target node is reachable from the processed
491 486
    ///node, then the \c reach parameter will be set to \c true.
492 487
    ///
493 488
    ///\param target The target node.
494 489
    ///\retval reach Indicates if the target node is reached.
495 490
    ///It should be initially \c false.
496 491
    ///
497 492
    ///\return The processed node.
498 493
    ///
499 494
    ///\pre The queue must not be empty.
500 495
    Node processNextNode(Node target, bool& reach)
501 496
    {
502 497
      if(_queue_tail==_queue_next_dist) {
503 498
        _curr_dist++;
504 499
        _queue_next_dist=_queue_head;
505 500
      }
506 501
      Node n=_queue[_queue_tail++];
507 502
      _processed->set(n,true);
508 503
      Node m;
509 504
      for(OutArcIt e(*G,n);e!=INVALID;++e)
510 505
        if(!(*_reached)[m=G->target(e)]) {
511 506
          _queue[_queue_head++]=m;
512 507
          _reached->set(m,true);
513 508
          _pred->set(m,e);
514 509
          _dist->set(m,_curr_dist);
515 510
          reach = reach || (target == m);
516 511
        }
517 512
      return n;
518 513
    }
519 514

	
520 515
    ///Processes the next node.
521 516

	
522 517
    ///Processes the next node and checks if at least one of reached
523 518
    ///nodes has \c true value in the \c nm node map. If one node
524 519
    ///with \c true value is reachable from the processed node, then the
525 520
    ///\c rnode parameter will be set to the first of such nodes.
526 521
    ///
527 522
    ///\param nm A \c bool (or convertible) node map that indicates the
528 523
    ///possible targets.
529 524
    ///\retval rnode The reached target node.
530 525
    ///It should be initially \c INVALID.
531 526
    ///
532 527
    ///\return The processed node.
533 528
    ///
534 529
    ///\pre The queue must not be empty.
535 530
    template<class NM>
536 531
    Node processNextNode(const NM& nm, Node& rnode)
537 532
    {
538 533
      if(_queue_tail==_queue_next_dist) {
539 534
        _curr_dist++;
540 535
        _queue_next_dist=_queue_head;
541 536
      }
542 537
      Node n=_queue[_queue_tail++];
543 538
      _processed->set(n,true);
544 539
      Node m;
545 540
      for(OutArcIt e(*G,n);e!=INVALID;++e)
546 541
        if(!(*_reached)[m=G->target(e)]) {
547 542
          _queue[_queue_head++]=m;
548 543
          _reached->set(m,true);
549 544
          _pred->set(m,e);
550 545
          _dist->set(m,_curr_dist);
551 546
          if (nm[m] && rnode == INVALID) rnode = m;
552 547
        }
553 548
      return n;
554 549
    }
555 550

	
556 551
    ///The next node to be processed.
557 552

	
558 553
    ///Returns the next node to be processed or \c INVALID if the queue
559 554
    ///is empty.
560 555
    Node nextNode() const
561 556
    {
562 557
      return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
563 558
    }
564 559

	
565 560
    ///\brief Returns \c false if there are nodes
566 561
    ///to be processed.
567 562
    ///
568 563
    ///Returns \c false if there are nodes
569 564
    ///to be processed in the queue.
570 565
    bool emptyQueue() const { return _queue_tail==_queue_head; }
571 566

	
572 567
    ///Returns the number of the nodes to be processed.
573 568

	
574 569
    ///Returns the number of the nodes to be processed in the queue.
575 570
    int queueSize() const { return _queue_head-_queue_tail; }
576 571

	
577 572
    ///Executes the algorithm.
578 573

	
579 574
    ///Executes the algorithm.
580 575
    ///
581 576
    ///This method runs the %BFS algorithm from the root node(s)
582 577
    ///in order to compute the shortest path to each node.
583 578
    ///
584 579
    ///The algorithm computes
585 580
    ///- the shortest path tree (forest),
586 581
    ///- the distance of each node from the root(s).
587 582
    ///
588 583
    ///\pre init() must be called and at least one root node should be
589 584
    ///added with addSource() before using this function.
590 585
    ///
591 586
    ///\note <tt>b.start()</tt> is just a shortcut of the following code.
592 587
    ///\code
593 588
    ///  while ( !b.emptyQueue() ) {
594 589
    ///    b.processNextNode();
595 590
    ///  }
596 591
    ///\endcode
597 592
    void start()
598 593
    {
599 594
      while ( !emptyQueue() ) processNextNode();
600 595
    }
601 596

	
602 597
    ///Executes the algorithm until the given target node is reached.
603 598

	
604 599
    ///Executes the algorithm until the given target node is reached.
605 600
    ///
606 601
    ///This method runs the %BFS algorithm from the root node(s)
607 602
    ///in order to compute the shortest path to \c t.
608 603
    ///
609 604
    ///The algorithm computes
610 605
    ///- the shortest path to \c t,
611 606
    ///- the distance of \c t from the root(s).
612 607
    ///
613 608
    ///\pre init() must be called and at least one root node should be
614 609
    ///added with addSource() before using this function.
615 610
    ///
616 611
    ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
617 612
    ///\code
618 613
    ///  bool reach = false;
619 614
    ///  while ( !b.emptyQueue() && !reach ) {
620 615
    ///    b.processNextNode(t, reach);
621 616
    ///  }
622 617
    ///\endcode
623 618
    void start(Node t)
624 619
    {
625 620
      bool reach = false;
626 621
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
627 622
    }
628 623

	
629 624
    ///Executes the algorithm until a condition is met.
630 625

	
631 626
    ///Executes the algorithm until a condition is met.
632 627
    ///
633 628
    ///This method runs the %BFS algorithm from the root node(s) in
634 629
    ///order to compute the shortest path to a node \c v with
635 630
    /// <tt>nm[v]</tt> true, if such a node can be found.
636 631
    ///
637 632
    ///\param nm A \c bool (or convertible) node map. The algorithm
638 633
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
639 634
    ///
640 635
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
641 636
    ///\c INVALID if no such node was found.
642 637
    ///
643 638
    ///\pre init() must be called and at least one root node should be
644 639
    ///added with addSource() before using this function.
645 640
    ///
646 641
    ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
647 642
    ///\code
648 643
    ///  Node rnode = INVALID;
649 644
    ///  while ( !b.emptyQueue() && rnode == INVALID ) {
650 645
    ///    b.processNextNode(nm, rnode);
651 646
    ///  }
652 647
    ///  return rnode;
653 648
    ///\endcode
654 649
    template<class NodeBoolMap>
655 650
    Node start(const NodeBoolMap &nm)
656 651
    {
657 652
      Node rnode = INVALID;
658 653
      while ( !emptyQueue() && rnode == INVALID ) {
659 654
        processNextNode(nm, rnode);
660 655
      }
661 656
      return rnode;
662 657
    }
663 658

	
664 659
    ///Runs the algorithm from the given source node.
665 660

	
666 661
    ///This method runs the %BFS algorithm from node \c s
667 662
    ///in order to compute the shortest path to each node.
668 663
    ///
669 664
    ///The algorithm computes
670 665
    ///- the shortest path tree,
671 666
    ///- the distance of each node from the root.
672 667
    ///
673 668
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
674 669
    ///\code
675 670
    ///  b.init();
676 671
    ///  b.addSource(s);
677 672
    ///  b.start();
678 673
    ///\endcode
679 674
    void run(Node s) {
680 675
      init();
681 676
      addSource(s);
682 677
      start();
683 678
    }
684 679

	
685 680
    ///Finds the shortest path between \c s and \c t.
686 681

	
687 682
    ///This method runs the %BFS algorithm from node \c s
688 683
    ///in order to compute the shortest path to node \c t
689 684
    ///(it stops searching when \c t is processed).
690 685
    ///
691 686
    ///\return \c true if \c t is reachable form \c s.
692 687
    ///
693 688
    ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
694 689
    ///shortcut of the following code.
695 690
    ///\code
696 691
    ///  b.init();
697 692
    ///  b.addSource(s);
698 693
    ///  b.start(t);
699 694
    ///\endcode
700 695
    bool run(Node s,Node t) {
701 696
      init();
702 697
      addSource(s);
703 698
      start(t);
704 699
      return reached(t);
705 700
    }
706 701

	
707 702
    ///Runs the algorithm to visit all nodes in the digraph.
708 703

	
709 704
    ///This method runs the %BFS algorithm in order to
710 705
    ///compute the shortest path to each node.
711 706
    ///
712 707
    ///The algorithm computes
713 708
    ///- the shortest path tree (forest),
714 709
    ///- the distance of each node from the root(s).
715 710
    ///
716 711
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
717 712
    ///\code
718 713
    ///  b.init();
719 714
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
720 715
    ///    if (!b.reached(n)) {
721 716
    ///      b.addSource(n);
722 717
    ///      b.start();
723 718
    ///    }
724 719
    ///  }
725 720
    ///\endcode
726 721
    void run() {
727 722
      init();
728 723
      for (NodeIt n(*G); n != INVALID; ++n) {
729 724
        if (!reached(n)) {
730 725
          addSource(n);
731 726
          start();
732 727
        }
733 728
      }
734 729
    }
735 730

	
736 731
    ///@}
737 732

	
738 733
    ///\name Query Functions
739 734
    ///The result of the %BFS algorithm can be obtained using these
740 735
    ///functions.\n
741 736
    ///Either \ref lemon::Bfs::run() "run()" or \ref lemon::Bfs::start()
742 737
    ///"start()" must be called before using them.
743 738

	
744 739
    ///@{
745 740

	
746 741
    ///The shortest path to a node.
747 742

	
748 743
    ///Returns the shortest path to a node.
749 744
    ///
750 745
    ///\warning \c t should be reachable from the root(s).
751 746
    ///
752 747
    ///\pre Either \ref run() or \ref start() must be called before
753 748
    ///using this function.
754 749
    Path path(Node t) const { return Path(*G, *_pred, t); }
755 750

	
756 751
    ///The distance of a node from the root(s).
757 752

	
758 753
    ///Returns the distance of a node from the root(s).
759 754
    ///
760 755
    ///\warning If node \c v is not reachable from the root(s), then
761 756
    ///the return value of this function is undefined.
762 757
    ///
763 758
    ///\pre Either \ref run() or \ref start() must be called before
764 759
    ///using this function.
765 760
    int dist(Node v) const { return (*_dist)[v]; }
766 761

	
767 762
    ///Returns the 'previous arc' of the shortest path tree for a node.
768 763

	
769 764
    ///This function returns the 'previous arc' of the shortest path
770 765
    ///tree for the node \c v, i.e. it returns the last arc of a
771 766
    ///shortest path from the root(s) to \c v. It is \c INVALID if \c v
772 767
    ///is not reachable from the root(s) or if \c v is a root.
773 768
    ///
774 769
    ///The shortest path tree used here is equal to the shortest path
775 770
    ///tree used in \ref predNode().
776 771
    ///
777 772
    ///\pre Either \ref run() or \ref start() must be called before
778 773
    ///using this function.
779 774
    Arc predArc(Node v) const { return (*_pred)[v];}
780 775

	
781 776
    ///Returns the 'previous node' of the shortest path tree for a node.
782 777

	
783 778
    ///This function returns the 'previous node' of the shortest path
784 779
    ///tree for the node \c v, i.e. it returns the last but one node
785 780
    ///from a shortest path from the root(s) to \c v. It is \c INVALID
786 781
    ///if \c v is not reachable from the root(s) or if \c v is a root.
787 782
    ///
788 783
    ///The shortest path tree used here is equal to the shortest path
789 784
    ///tree used in \ref predArc().
790 785
    ///
791 786
    ///\pre Either \ref run() or \ref start() must be called before
792 787
    ///using this function.
793 788
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
794 789
                                  G->source((*_pred)[v]); }
795 790

	
796 791
    ///\brief Returns a const reference to the node map that stores the
797 792
    /// distances of the nodes.
798 793
    ///
799 794
    ///Returns a const reference to the node map that stores the distances
800 795
    ///of the nodes calculated by the algorithm.
801 796
    ///
802 797
    ///\pre Either \ref run() or \ref init()
803 798
    ///must be called before using this function.
804 799
    const DistMap &distMap() const { return *_dist;}
805 800

	
806 801
    ///\brief Returns a const reference to the node map that stores the
807 802
    ///predecessor arcs.
808 803
    ///
809 804
    ///Returns a const reference to the node map that stores the predecessor
810 805
    ///arcs, which form the shortest path tree.
811 806
    ///
812 807
    ///\pre Either \ref run() or \ref init()
813 808
    ///must be called before using this function.
814 809
    const PredMap &predMap() const { return *_pred;}
815 810

	
816 811
    ///Checks if a node is reachable from the root(s).
817 812

	
818 813
    ///Returns \c true if \c v is reachable from the root(s).
819 814
    ///\pre Either \ref run() or \ref start()
820 815
    ///must be called before using this function.
821 816
    bool reached(Node v) const { return (*_reached)[v]; }
822 817

	
823 818
    ///@}
824 819
  };
825 820

	
826 821
  ///Default traits class of bfs() function.
827 822

	
828 823
  ///Default traits class of bfs() function.
829 824
  ///\tparam GR Digraph type.
830 825
  template<class GR>
831 826
  struct BfsWizardDefaultTraits
832 827
  {
833 828
    ///The type of the digraph the algorithm runs on.
834 829
    typedef GR Digraph;
835 830

	
836 831
    ///\brief The type of the map that stores the predecessor
837 832
    ///arcs of the shortest paths.
838 833
    ///
839 834
    ///The type of the map that stores the predecessor
840 835
    ///arcs of the shortest paths.
841 836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
842 837
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
843 838
    ///Instantiates a \ref PredMap.
844 839

	
845 840
    ///This function instantiates a \ref PredMap.
846 841
    ///\param g is the digraph, to which we would like to define the
847 842
    ///\ref PredMap.
848 843
    static PredMap *createPredMap(const Digraph &g)
849 844
    {
850 845
      return new PredMap(g);
851 846
    }
852 847

	
853 848
    ///The type of the map that indicates which nodes are processed.
854 849

	
855 850
    ///The type of the map that indicates which nodes are processed.
856 851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
857 852
    ///By default it is a NullMap.
858 853
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
859 854
    ///Instantiates a \ref ProcessedMap.
860 855

	
861 856
    ///This function instantiates a \ref ProcessedMap.
862 857
    ///\param g is the digraph, to which
863 858
    ///we would like to define the \ref ProcessedMap.
864 859
#ifdef DOXYGEN
865 860
    static ProcessedMap *createProcessedMap(const Digraph &g)
866 861
#else
867 862
    static ProcessedMap *createProcessedMap(const Digraph &)
868 863
#endif
869 864
    {
870 865
      return new ProcessedMap();
871 866
    }
872 867

	
873 868
    ///The type of the map that indicates which nodes are reached.
874 869

	
875 870
    ///The type of the map that indicates which nodes are reached.
876 871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
877 872
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
878 873
    ///Instantiates a \ref ReachedMap.
879 874

	
880 875
    ///This function instantiates a \ref ReachedMap.
881 876
    ///\param g is the digraph, to which
882 877
    ///we would like to define the \ref ReachedMap.
883 878
    static ReachedMap *createReachedMap(const Digraph &g)
884 879
    {
885 880
      return new ReachedMap(g);
886 881
    }
887 882

	
888 883
    ///The type of the map that stores the distances of the nodes.
889 884

	
890 885
    ///The type of the map that stores the distances of the nodes.
891 886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
892 887
    typedef typename Digraph::template NodeMap<int> DistMap;
893 888
    ///Instantiates a \ref DistMap.
894 889

	
895 890
    ///This function instantiates a \ref DistMap.
896 891
    ///\param g is the digraph, to which we would like to define
897 892
    ///the \ref DistMap
898 893
    static DistMap *createDistMap(const Digraph &g)
899 894
    {
900 895
      return new DistMap(g);
901 896
    }
902 897

	
903 898
    ///The type of the shortest paths.
904 899

	
905 900
    ///The type of the shortest paths.
906 901
    ///It must meet the \ref concepts::Path "Path" concept.
907 902
    typedef lemon::Path<Digraph> Path;
908 903
  };
909 904

	
910 905
  /// Default traits class used by \ref BfsWizard
911 906

	
912 907
  /// To make it easier to use Bfs algorithm
913 908
  /// we have created a wizard class.
914 909
  /// This \ref BfsWizard class needs default traits,
915 910
  /// as well as the \ref Bfs class.
916 911
  /// The \ref BfsWizardBase is a class to be the default traits of the
917 912
  /// \ref BfsWizard class.
918 913
  template<class GR>
919 914
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
920 915
  {
921 916

	
922 917
    typedef BfsWizardDefaultTraits<GR> Base;
923 918
  protected:
924 919
    //The type of the nodes in the digraph.
925 920
    typedef typename Base::Digraph::Node Node;
926 921

	
927 922
    //Pointer to the digraph the algorithm runs on.
928 923
    void *_g;
929 924
    //Pointer to the map of reached nodes.
930 925
    void *_reached;
931 926
    //Pointer to the map of processed nodes.
932 927
    void *_processed;
933 928
    //Pointer to the map of predecessors arcs.
934 929
    void *_pred;
935 930
    //Pointer to the map of distances.
936 931
    void *_dist;
937 932
    //Pointer to the shortest path to the target node.
938 933
    void *_path;
939 934
    //Pointer to the distance of the target node.
940 935
    int *_di;
941 936

	
942 937
    public:
943 938
    /// Constructor.
944 939

	
945 940
    /// This constructor does not require parameters, therefore it initiates
946 941
    /// all of the attributes to \c 0.
947 942
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
948 943
                      _dist(0), _path(0), _di(0) {}
949 944

	
950 945
    /// Constructor.
951 946

	
952 947
    /// This constructor requires one parameter,
953 948
    /// others are initiated to \c 0.
954 949
    /// \param g The digraph the algorithm runs on.
955 950
    BfsWizardBase(const GR &g) :
956 951
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
957 952
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
958 953

	
959 954
  };
960 955

	
961 956
  /// Auxiliary class for the function-type interface of BFS algorithm.
962 957

	
963 958
  /// This auxiliary class is created to implement the
964 959
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
965 960
  /// It does not have own \ref run() method, it uses the functions
966 961
  /// and features of the plain \ref Bfs.
967 962
  ///
968 963
  /// This class should only be used through the \ref bfs() function,
969 964
  /// which makes it easier to use the algorithm.
970 965
  template<class TR>
971 966
  class BfsWizard : public TR
972 967
  {
973 968
    typedef TR Base;
974 969

	
975 970
    ///The type of the digraph the algorithm runs on.
976 971
    typedef typename TR::Digraph Digraph;
977 972

	
978 973
    typedef typename Digraph::Node Node;
979 974
    typedef typename Digraph::NodeIt NodeIt;
980 975
    typedef typename Digraph::Arc Arc;
981 976
    typedef typename Digraph::OutArcIt OutArcIt;
982 977

	
983 978
    ///\brief The type of the map that stores the predecessor
984 979
    ///arcs of the shortest paths.
985 980
    typedef typename TR::PredMap PredMap;
986 981
    ///\brief The type of the map that stores the distances of the nodes.
987 982
    typedef typename TR::DistMap DistMap;
988 983
    ///\brief The type of the map that indicates which nodes are reached.
989 984
    typedef typename TR::ReachedMap ReachedMap;
990 985
    ///\brief The type of the map that indicates which nodes are processed.
991 986
    typedef typename TR::ProcessedMap ProcessedMap;
992 987
    ///The type of the shortest paths
993 988
    typedef typename TR::Path Path;
994 989

	
995 990
  public:
996 991

	
997 992
    /// Constructor.
998 993
    BfsWizard() : TR() {}
999 994

	
1000 995
    /// Constructor that requires parameters.
1001 996

	
1002 997
    /// Constructor that requires parameters.
1003 998
    /// These parameters will be the default values for the traits class.
1004 999
    /// \param g The digraph the algorithm runs on.
1005 1000
    BfsWizard(const Digraph &g) :
1006 1001
      TR(g) {}
1007 1002

	
1008 1003
    ///Copy constructor
1009 1004
    BfsWizard(const TR &b) : TR(b) {}
1010 1005

	
1011 1006
    ~BfsWizard() {}
1012 1007

	
1013 1008
    ///Runs BFS algorithm from the given source node.
1014 1009

	
1015 1010
    ///This method runs BFS algorithm from node \c s
1016 1011
    ///in order to compute the shortest path to each node.
1017 1012
    void run(Node s)
1018 1013
    {
1019 1014
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1020 1015
      if (Base::_pred)
1021 1016
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1022 1017
      if (Base::_dist)
1023 1018
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1024 1019
      if (Base::_reached)
1025 1020
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1026 1021
      if (Base::_processed)
1027 1022
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1028 1023
      if (s!=INVALID)
1029 1024
        alg.run(s);
1030 1025
      else
1031 1026
        alg.run();
1032 1027
    }
1033 1028

	
1034 1029
    ///Finds the shortest path between \c s and \c t.
1035 1030

	
1036 1031
    ///This method runs BFS algorithm from node \c s
1037 1032
    ///in order to compute the shortest path to node \c t
1038 1033
    ///(it stops searching when \c t is processed).
1039 1034
    ///
1040 1035
    ///\return \c true if \c t is reachable form \c s.
1041 1036
    bool run(Node s, Node t)
1042 1037
    {
1043
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1044 1038
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1045 1039
      if (Base::_pred)
1046 1040
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1047 1041
      if (Base::_dist)
1048 1042
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1049 1043
      if (Base::_reached)
1050 1044
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1051 1045
      if (Base::_processed)
1052 1046
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1053 1047
      alg.run(s,t);
1054 1048
      if (Base::_path)
1055 1049
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1056 1050
      if (Base::_di)
1057 1051
        *Base::_di = alg.dist(t);
1058 1052
      return alg.reached(t);
1059 1053
    }
1060 1054

	
1061 1055
    ///Runs BFS algorithm to visit all nodes in the digraph.
1062 1056

	
1063 1057
    ///This method runs BFS algorithm in order to compute
1064 1058
    ///the shortest path to each node.
1065 1059
    void run()
1066 1060
    {
1067 1061
      run(INVALID);
1068 1062
    }
1069 1063

	
1070 1064
    template<class T>
1071 1065
    struct SetPredMapBase : public Base {
1072 1066
      typedef T PredMap;
1073 1067
      static PredMap *createPredMap(const Digraph &) { return 0; };
1074 1068
      SetPredMapBase(const TR &b) : TR(b) {}
1075 1069
    };
1076 1070
    ///\brief \ref named-func-param "Named parameter"
1077 1071
    ///for setting \ref PredMap object.
1078 1072
    ///
1079 1073
    ///\ref named-func-param "Named parameter"
1080 1074
    ///for setting \ref PredMap object.
1081 1075
    template<class T>
1082 1076
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1083 1077
    {
1084 1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1085 1079
      return BfsWizard<SetPredMapBase<T> >(*this);
1086 1080
    }
1087 1081

	
1088 1082
    template<class T>
1089 1083
    struct SetReachedMapBase : public Base {
1090 1084
      typedef T ReachedMap;
1091 1085
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1092 1086
      SetReachedMapBase(const TR &b) : TR(b) {}
1093 1087
    };
1094 1088
    ///\brief \ref named-func-param "Named parameter"
1095 1089
    ///for setting \ref ReachedMap object.
1096 1090
    ///
1097 1091
    /// \ref named-func-param "Named parameter"
1098 1092
    ///for setting \ref ReachedMap object.
1099 1093
    template<class T>
1100 1094
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1101 1095
    {
1102 1096
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1103 1097
      return BfsWizard<SetReachedMapBase<T> >(*this);
1104 1098
    }
1105 1099

	
1106 1100
    template<class T>
1107 1101
    struct SetDistMapBase : public Base {
1108 1102
      typedef T DistMap;
1109 1103
      static DistMap *createDistMap(const Digraph &) { return 0; };
1110 1104
      SetDistMapBase(const TR &b) : TR(b) {}
1111 1105
    };
1112 1106
    ///\brief \ref named-func-param "Named parameter"
1113 1107
    ///for setting \ref DistMap object.
1114 1108
    ///
1115 1109
    /// \ref named-func-param "Named parameter"
1116 1110
    ///for setting \ref DistMap object.
1117 1111
    template<class T>
1118 1112
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1119 1113
    {
1120 1114
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1121 1115
      return BfsWizard<SetDistMapBase<T> >(*this);
1122 1116
    }
1123 1117

	
1124 1118
    template<class T>
1125 1119
    struct SetProcessedMapBase : public Base {
1126 1120
      typedef T ProcessedMap;
1127 1121
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1128 1122
      SetProcessedMapBase(const TR &b) : TR(b) {}
1129 1123
    };
1130 1124
    ///\brief \ref named-func-param "Named parameter"
1131 1125
    ///for setting \ref ProcessedMap object.
1132 1126
    ///
1133 1127
    /// \ref named-func-param "Named parameter"
1134 1128
    ///for setting \ref ProcessedMap object.
1135 1129
    template<class T>
1136 1130
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1137 1131
    {
1138 1132
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1139 1133
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1140 1134
    }
1141 1135

	
1142 1136
    template<class T>
1143 1137
    struct SetPathBase : public Base {
1144 1138
      typedef T Path;
1145 1139
      SetPathBase(const TR &b) : TR(b) {}
1146 1140
    };
1147 1141
    ///\brief \ref named-func-param "Named parameter"
1148 1142
    ///for getting the shortest path to the target node.
1149 1143
    ///
1150 1144
    ///\ref named-func-param "Named parameter"
1151 1145
    ///for getting the shortest path to the target node.
1152 1146
    template<class T>
1153 1147
    BfsWizard<SetPathBase<T> > path(const T &t)
1154 1148
    {
1155 1149
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1156 1150
      return BfsWizard<SetPathBase<T> >(*this);
1157 1151
    }
1158 1152

	
1159 1153
    ///\brief \ref named-func-param "Named parameter"
1160 1154
    ///for getting the distance of the target node.
1161 1155
    ///
1162 1156
    ///\ref named-func-param "Named parameter"
1163 1157
    ///for getting the distance of the target node.
1164 1158
    BfsWizard dist(const int &d)
1165 1159
    {
1166 1160
      Base::_di=const_cast<int*>(&d);
1167 1161
      return *this;
1168 1162
    }
1169 1163

	
1170 1164
  };
1171 1165

	
1172 1166
  ///Function-type interface for BFS algorithm.
1173 1167

	
1174 1168
  /// \ingroup search
1175 1169
  ///Function-type interface for BFS algorithm.
1176 1170
  ///
1177 1171
  ///This function also has several \ref named-func-param "named parameters",
1178 1172
  ///they are declared as the members of class \ref BfsWizard.
1179 1173
  ///The following examples show how to use these parameters.
1180 1174
  ///\code
1181 1175
  ///  // Compute shortest path from node s to each node
1182 1176
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1183 1177
  ///
1184 1178
  ///  // Compute shortest path from s to t
1185 1179
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1186 1180
  ///\endcode
1187 1181
  ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1188 1182
  ///to the end of the parameter list.
1189 1183
  ///\sa BfsWizard
1190 1184
  ///\sa Bfs
1191 1185
  template<class GR>
1192 1186
  BfsWizard<BfsWizardBase<GR> >
1193 1187
  bfs(const GR &digraph)
1194 1188
  {
1195 1189
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1196 1190
  }
1197 1191

	
1198 1192
#ifdef DOXYGEN
1199 1193
  /// \brief Visitor class for BFS.
1200 1194
  ///
1201 1195
  /// This class defines the interface of the BfsVisit events, and
1202 1196
  /// it could be the base of a real visitor class.
1203 1197
  template <typename _Digraph>
1204 1198
  struct BfsVisitor {
1205 1199
    typedef _Digraph Digraph;
1206 1200
    typedef typename Digraph::Arc Arc;
1207 1201
    typedef typename Digraph::Node Node;
1208 1202
    /// \brief Called for the source node(s) of the BFS.
1209 1203
    ///
1210 1204
    /// This function is called for the source node(s) of the BFS.
1211 1205
    void start(const Node& node) {}
1212 1206
    /// \brief Called when a node is reached first time.
1213 1207
    ///
1214 1208
    /// This function is called when a node is reached first time.
1215 1209
    void reach(const Node& node) {}
1216 1210
    /// \brief Called when a node is processed.
1217 1211
    ///
1218 1212
    /// This function is called when a node is processed.
1219 1213
    void process(const Node& node) {}
1220 1214
    /// \brief Called when an arc reaches a new node.
1221 1215
    ///
1222 1216
    /// This function is called when the BFS finds an arc whose target node
1223 1217
    /// is not reached yet.
1224 1218
    void discover(const Arc& arc) {}
1225 1219
    /// \brief Called when an arc is examined but its target node is
1226 1220
    /// already discovered.
1227 1221
    ///
1228 1222
    /// This function is called when an arc is examined but its target node is
1229 1223
    /// already discovered.
1230 1224
    void examine(const Arc& arc) {}
1231 1225
  };
1232 1226
#else
1233 1227
  template <typename _Digraph>
1234 1228
  struct BfsVisitor {
1235 1229
    typedef _Digraph Digraph;
1236 1230
    typedef typename Digraph::Arc Arc;
1237 1231
    typedef typename Digraph::Node Node;
1238 1232
    void start(const Node&) {}
1239 1233
    void reach(const Node&) {}
1240 1234
    void process(const Node&) {}
1241 1235
    void discover(const Arc&) {}
1242 1236
    void examine(const Arc&) {}
1243 1237

	
1244 1238
    template <typename _Visitor>
1245 1239
    struct Constraints {
1246 1240
      void constraints() {
1247 1241
        Arc arc;
1248 1242
        Node node;
1249 1243
        visitor.start(node);
1250 1244
        visitor.reach(node);
1251 1245
        visitor.process(node);
1252 1246
        visitor.discover(arc);
1253 1247
        visitor.examine(arc);
1254 1248
      }
1255 1249
      _Visitor& visitor;
1256 1250
    };
1257 1251
  };
1258 1252
#endif
1259 1253

	
1260 1254
  /// \brief Default traits class of BfsVisit class.
1261 1255
  ///
1262 1256
  /// Default traits class of BfsVisit class.
1263 1257
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1264 1258
  template<class _Digraph>
1265 1259
  struct BfsVisitDefaultTraits {
1266 1260

	
1267 1261
    /// \brief The type of the digraph the algorithm runs on.
1268 1262
    typedef _Digraph Digraph;
1269 1263

	
1270 1264
    /// \brief The type of the map that indicates which nodes are reached.
1271 1265
    ///
1272 1266
    /// The type of the map that indicates which nodes are reached.
1273 1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1274 1268
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1275 1269

	
1276 1270
    /// \brief Instantiates a \ref ReachedMap.
1277 1271
    ///
1278 1272
    /// This function instantiates a \ref ReachedMap.
1279 1273
    /// \param digraph is the digraph, to which
1280 1274
    /// we would like to define the \ref ReachedMap.
1281 1275
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1282 1276
      return new ReachedMap(digraph);
1283 1277
    }
1284 1278

	
1285 1279
  };
1286 1280

	
1287 1281
  /// \ingroup search
1288 1282
  ///
1289 1283
  /// \brief %BFS algorithm class with visitor interface.
1290 1284
  ///
1291 1285
  /// This class provides an efficient implementation of the %BFS algorithm
1292 1286
  /// with visitor interface.
1293 1287
  ///
1294 1288
  /// The %BfsVisit class provides an alternative interface to the Bfs
1295 1289
  /// class. It works with callback mechanism, the BfsVisit object calls
1296 1290
  /// the member functions of the \c Visitor class on every BFS event.
1297 1291
  ///
1298 1292
  /// This interface of the BFS algorithm should be used in special cases
1299 1293
  /// when extra actions have to be performed in connection with certain
1300 1294
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1301 1295
  /// instead.
1302 1296
  ///
1303 1297
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1304 1298
  /// The default value is
1305 1299
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1306 1300
  /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1307 1301
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1308 1302
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
1309 1303
  /// does not observe the BFS events. If you want to observe the BFS
1310 1304
  /// events, you should implement your own visitor class.
1311 1305
  /// \tparam _Traits Traits class to set various data types used by the
1312 1306
  /// algorithm. The default traits class is
1313 1307
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1314 1308
  /// See \ref BfsVisitDefaultTraits for the documentation of
1315 1309
  /// a BFS visit traits class.
1316 1310
#ifdef DOXYGEN
1317 1311
  template <typename _Digraph, typename _Visitor, typename _Traits>
1318 1312
#else
1319 1313
  template <typename _Digraph = ListDigraph,
1320 1314
            typename _Visitor = BfsVisitor<_Digraph>,
1321 1315
            typename _Traits = BfsVisitDefaultTraits<_Digraph> >
1322 1316
#endif
1323 1317
  class BfsVisit {
1324 1318
  public:
1325 1319

	
1326
    /// \brief \ref Exception for uninitialized parameters.
1327
    ///
1328
    /// This error represents problems in the initialization
1329
    /// of the parameters of the algorithm.
1330
    class UninitializedParameter : public lemon::UninitializedParameter {
1331
    public:
1332
      virtual const char* what() const throw()
1333
      {
1334
        return "lemon::BfsVisit::UninitializedParameter";
1335
      }
1336
    };
1337

	
1338 1320
    ///The traits class.
1339 1321
    typedef _Traits Traits;
1340 1322

	
1341 1323
    ///The type of the digraph the algorithm runs on.
1342 1324
    typedef typename Traits::Digraph Digraph;
1343 1325

	
1344 1326
    ///The visitor type used by the algorithm.
1345 1327
    typedef _Visitor Visitor;
1346 1328

	
1347 1329
    ///The type of the map that indicates which nodes are reached.
1348 1330
    typedef typename Traits::ReachedMap ReachedMap;
1349 1331

	
1350 1332
  private:
1351 1333

	
1352 1334
    typedef typename Digraph::Node Node;
1353 1335
    typedef typename Digraph::NodeIt NodeIt;
1354 1336
    typedef typename Digraph::Arc Arc;
1355 1337
    typedef typename Digraph::OutArcIt OutArcIt;
1356 1338

	
1357 1339
    //Pointer to the underlying digraph.
1358 1340
    const Digraph *_digraph;
1359 1341
    //Pointer to the visitor object.
1360 1342
    Visitor *_visitor;
1361 1343
    //Pointer to the map of reached status of the nodes.
1362 1344
    ReachedMap *_reached;
1363 1345
    //Indicates if _reached is locally allocated (true) or not.
1364 1346
    bool local_reached;
1365 1347

	
1366 1348
    std::vector<typename Digraph::Node> _list;
1367 1349
    int _list_front, _list_back;
1368 1350

	
1369 1351
    //Creates the maps if necessary.
1370 1352
    void create_maps() {
1371 1353
      if(!_reached) {
1372 1354
        local_reached = true;
1373 1355
        _reached = Traits::createReachedMap(*_digraph);
1374 1356
      }
1375 1357
    }
1376 1358

	
1377 1359
  protected:
1378 1360

	
1379 1361
    BfsVisit() {}
1380 1362

	
1381 1363
  public:
1382 1364

	
1383 1365
    typedef BfsVisit Create;
1384 1366

	
1385 1367
    /// \name Named template parameters
1386 1368

	
1387 1369
    ///@{
1388 1370
    template <class T>
1389 1371
    struct SetReachedMapTraits : public Traits {
1390 1372
      typedef T ReachedMap;
1391 1373
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1392
        throw UninitializedParameter();
1374
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1375
        return 0; // ignore warnings
1393 1376
      }
1394 1377
    };
1395 1378
    /// \brief \ref named-templ-param "Named parameter" for setting
1396 1379
    /// ReachedMap type.
1397 1380
    ///
1398 1381
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1399 1382
    template <class T>
1400 1383
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1401 1384
                                            SetReachedMapTraits<T> > {
1402 1385
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1403 1386
    };
1404 1387
    ///@}
1405 1388

	
1406 1389
  public:
1407 1390

	
1408 1391
    /// \brief Constructor.
1409 1392
    ///
1410 1393
    /// Constructor.
1411 1394
    ///
1412 1395
    /// \param digraph The digraph the algorithm runs on.
1413 1396
    /// \param visitor The visitor object of the algorithm.
1414 1397
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1415 1398
      : _digraph(&digraph), _visitor(&visitor),
1416 1399
        _reached(0), local_reached(false) {}
1417 1400

	
1418 1401
    /// \brief Destructor.
1419 1402
    ~BfsVisit() {
1420 1403
      if(local_reached) delete _reached;
1421 1404
    }
1422 1405

	
1423 1406
    /// \brief Sets the map that indicates which nodes are reached.
1424 1407
    ///
1425 1408
    /// Sets the map that indicates which nodes are reached.
1426 1409
    /// If you don't use this function before calling \ref run(),
1427 1410
    /// it will allocate one. The destructor deallocates this
1428 1411
    /// automatically allocated map, of course.
1429 1412
    /// \return <tt> (*this) </tt>
1430 1413
    BfsVisit &reachedMap(ReachedMap &m) {
1431 1414
      if(local_reached) {
1432 1415
        delete _reached;
1433 1416
        local_reached = false;
1434 1417
      }
1435 1418
      _reached = &m;
1436 1419
      return *this;
1437 1420
    }
1438 1421

	
1439 1422
  public:
1440 1423

	
1441 1424
    /// \name Execution control
1442 1425
    /// The simplest way to execute the algorithm is to use
1443 1426
    /// one of the member functions called \ref lemon::BfsVisit::run()
1444 1427
    /// "run()".
1445 1428
    /// \n
1446 1429
    /// If you need more control on the execution, first you must call
1447 1430
    /// \ref lemon::BfsVisit::init() "init()", then you can add several
1448 1431
    /// source nodes with \ref lemon::BfsVisit::addSource() "addSource()".
1449 1432
    /// Finally \ref lemon::BfsVisit::start() "start()" will perform the
1450 1433
    /// actual path computation.
1451 1434

	
1452 1435
    /// @{
1453 1436

	
1454 1437
    /// \brief Initializes the internal data structures.
1455 1438
    ///
1456 1439
    /// Initializes the internal data structures.
1457 1440
    void init() {
1458 1441
      create_maps();
1459 1442
      _list.resize(countNodes(*_digraph));
1460 1443
      _list_front = _list_back = -1;
1461 1444
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1462 1445
        _reached->set(u, false);
1463 1446
      }
1464 1447
    }
1465 1448

	
1466 1449
    /// \brief Adds a new source node.
1467 1450
    ///
1468 1451
    /// Adds a new source node to the set of nodes to be processed.
1469 1452
    void addSource(Node s) {
1470 1453
      if(!(*_reached)[s]) {
1471 1454
          _reached->set(s,true);
1472 1455
          _visitor->start(s);
1473 1456
          _visitor->reach(s);
1474 1457
          _list[++_list_back] = s;
1475 1458
        }
1476 1459
    }
1477 1460

	
1478 1461
    /// \brief Processes the next node.
1479 1462
    ///
1480 1463
    /// Processes the next node.
1481 1464
    ///
1482 1465
    /// \return The processed node.
1483 1466
    ///
1484 1467
    /// \pre The queue must not be empty.
1485 1468
    Node processNextNode() {
1486 1469
      Node n = _list[++_list_front];
1487 1470
      _visitor->process(n);
1488 1471
      Arc e;
1489 1472
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1490 1473
        Node m = _digraph->target(e);
1491 1474
        if (!(*_reached)[m]) {
1492 1475
          _visitor->discover(e);
1493 1476
          _visitor->reach(m);
1494 1477
          _reached->set(m, true);
1495 1478
          _list[++_list_back] = m;
1496 1479
        } else {
1497 1480
          _visitor->examine(e);
1498 1481
        }
1499 1482
      }
1500 1483
      return n;
1501 1484
    }
1502 1485

	
1503 1486
    /// \brief Processes the next node.
1504 1487
    ///
1505 1488
    /// Processes the next node and checks if the given target node
1506 1489
    /// is reached. If the target node is reachable from the processed
1507 1490
    /// node, then the \c reach parameter will be set to \c true.
1508 1491
    ///
1509 1492
    /// \param target The target node.
1510 1493
    /// \retval reach Indicates if the target node is reached.
1511 1494
    /// It should be initially \c false.
1512 1495
    ///
1513 1496
    /// \return The processed node.
1514 1497
    ///
1515 1498
    /// \pre The queue must not be empty.
1516 1499
    Node processNextNode(Node target, bool& reach) {
1517 1500
      Node n = _list[++_list_front];
1518 1501
      _visitor->process(n);
1519 1502
      Arc e;
1520 1503
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1521 1504
        Node m = _digraph->target(e);
1522 1505
        if (!(*_reached)[m]) {
1523 1506
          _visitor->discover(e);
1524 1507
          _visitor->reach(m);
1525 1508
          _reached->set(m, true);
1526 1509
          _list[++_list_back] = m;
1527 1510
          reach = reach || (target == m);
1528 1511
        } else {
1529 1512
          _visitor->examine(e);
1530 1513
        }
1531 1514
      }
1532 1515
      return n;
1533 1516
    }
1534 1517

	
1535 1518
    /// \brief Processes the next node.
1536 1519
    ///
1537 1520
    /// Processes the next node and checks if at least one of reached
1538 1521
    /// nodes has \c true value in the \c nm node map. If one node
1539 1522
    /// with \c true value is reachable from the processed node, then the
1540 1523
    /// \c rnode parameter will be set to the first of such nodes.
1541 1524
    ///
1542 1525
    /// \param nm A \c bool (or convertible) node map that indicates the
1543 1526
    /// possible targets.
1544 1527
    /// \retval rnode The reached target node.
1545 1528
    /// It should be initially \c INVALID.
1546 1529
    ///
1547 1530
    /// \return The processed node.
1548 1531
    ///
1549 1532
    /// \pre The queue must not be empty.
1550 1533
    template <typename NM>
1551 1534
    Node processNextNode(const NM& nm, Node& rnode) {
1552 1535
      Node n = _list[++_list_front];
1553 1536
      _visitor->process(n);
1554 1537
      Arc e;
1555 1538
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1556 1539
        Node m = _digraph->target(e);
1557 1540
        if (!(*_reached)[m]) {
1558 1541
          _visitor->discover(e);
1559 1542
          _visitor->reach(m);
1560 1543
          _reached->set(m, true);
1561 1544
          _list[++_list_back] = m;
1562 1545
          if (nm[m] && rnode == INVALID) rnode = m;
1563 1546
        } else {
1564 1547
          _visitor->examine(e);
1565 1548
        }
1566 1549
      }
1567 1550
      return n;
1568 1551
    }
1569 1552

	
1570 1553
    /// \brief The next node to be processed.
1571 1554
    ///
1572 1555
    /// Returns the next node to be processed or \c INVALID if the queue
1573 1556
    /// is empty.
1574 1557
    Node nextNode() const {
1575 1558
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1576 1559
    }
1577 1560

	
1578 1561
    /// \brief Returns \c false if there are nodes
1579 1562
    /// to be processed.
1580 1563
    ///
1581 1564
    /// Returns \c false if there are nodes
1582 1565
    /// to be processed in the queue.
1583 1566
    bool emptyQueue() const { return _list_front == _list_back; }
1584 1567

	
1585 1568
    /// \brief Returns the number of the nodes to be processed.
1586 1569
    ///
1587 1570
    /// Returns the number of the nodes to be processed in the queue.
1588 1571
    int queueSize() const { return _list_back - _list_front; }
1589 1572

	
1590 1573
    /// \brief Executes the algorithm.
1591 1574
    ///
1592 1575
    /// Executes the algorithm.
1593 1576
    ///
1594 1577
    /// This method runs the %BFS algorithm from the root node(s)
1595 1578
    /// in order to compute the shortest path to each node.
1596 1579
    ///
1597 1580
    /// The algorithm computes
1598 1581
    /// - the shortest path tree (forest),
1599 1582
    /// - the distance of each node from the root(s).
1600 1583
    ///
1601 1584
    /// \pre init() must be called and at least one root node should be added
1602 1585
    /// with addSource() before using this function.
1603 1586
    ///
1604 1587
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1605 1588
    /// \code
1606 1589
    ///   while ( !b.emptyQueue() ) {
1607 1590
    ///     b.processNextNode();
1608 1591
    ///   }
1609 1592
    /// \endcode
1610 1593
    void start() {
1611 1594
      while ( !emptyQueue() ) processNextNode();
1612 1595
    }
1613 1596

	
1614 1597
    /// \brief Executes the algorithm until the given target node is reached.
1615 1598
    ///
1616 1599
    /// Executes the algorithm until the given target node is reached.
1617 1600
    ///
1618 1601
    /// This method runs the %BFS algorithm from the root node(s)
1619 1602
    /// in order to compute the shortest path to \c t.
1620 1603
    ///
1621 1604
    /// The algorithm computes
1622 1605
    /// - the shortest path to \c t,
1623 1606
    /// - the distance of \c t from the root(s).
1624 1607
    ///
1625 1608
    /// \pre init() must be called and at least one root node should be
1626 1609
    /// added with addSource() before using this function.
1627 1610
    ///
1628 1611
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1629 1612
    /// \code
1630 1613
    ///   bool reach = false;
1631 1614
    ///   while ( !b.emptyQueue() && !reach ) {
1632 1615
    ///     b.processNextNode(t, reach);
1633 1616
    ///   }
1634 1617
    /// \endcode
1635 1618
    void start(Node t) {
1636 1619
      bool reach = false;
1637 1620
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1638 1621
    }
1639 1622

	
1640 1623
    /// \brief Executes the algorithm until a condition is met.
1641 1624
    ///
1642 1625
    /// Executes the algorithm until a condition is met.
1643 1626
    ///
1644 1627
    /// This method runs the %BFS algorithm from the root node(s) in
1645 1628
    /// order to compute the shortest path to a node \c v with
1646 1629
    /// <tt>nm[v]</tt> true, if such a node can be found.
1647 1630
    ///
1648 1631
    /// \param nm must be a bool (or convertible) node map. The
1649 1632
    /// algorithm will stop when it reaches a node \c v with
1650 1633
    /// <tt>nm[v]</tt> true.
1651 1634
    ///
1652 1635
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1653 1636
    /// \c INVALID if no such node was found.
1654 1637
    ///
1655 1638
    /// \pre init() must be called and at least one root node should be
1656 1639
    /// added with addSource() before using this function.
1657 1640
    ///
1658 1641
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1659 1642
    /// \code
1660 1643
    ///   Node rnode = INVALID;
1661 1644
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1662 1645
    ///     b.processNextNode(nm, rnode);
1663 1646
    ///   }
1664 1647
    ///   return rnode;
1665 1648
    /// \endcode
1666 1649
    template <typename NM>
1667 1650
    Node start(const NM &nm) {
1668 1651
      Node rnode = INVALID;
1669 1652
      while ( !emptyQueue() && rnode == INVALID ) {
1670 1653
        processNextNode(nm, rnode);
1671 1654
      }
1672 1655
      return rnode;
1673 1656
    }
1674 1657

	
1675 1658
    /// \brief Runs the algorithm from the given source node.
1676 1659
    ///
1677 1660
    /// This method runs the %BFS algorithm from node \c s
1678 1661
    /// in order to compute the shortest path to each node.
1679 1662
    ///
1680 1663
    /// The algorithm computes
1681 1664
    /// - the shortest path tree,
1682 1665
    /// - the distance of each node from the root.
1683 1666
    ///
1684 1667
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1685 1668
    ///\code
1686 1669
    ///   b.init();
1687 1670
    ///   b.addSource(s);
1688 1671
    ///   b.start();
1689 1672
    ///\endcode
1690 1673
    void run(Node s) {
1691 1674
      init();
1692 1675
      addSource(s);
1693 1676
      start();
1694 1677
    }
1695 1678

	
1696 1679
    /// \brief Finds the shortest path between \c s and \c t.
1697 1680
    ///
1698 1681
    /// This method runs the %BFS algorithm from node \c s
1699 1682
    /// in order to compute the shortest path to node \c t
1700 1683
    /// (it stops searching when \c t is processed).
1701 1684
    ///
1702 1685
    /// \return \c true if \c t is reachable form \c s.
1703 1686
    ///
1704 1687
    /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1705 1688
    /// shortcut of the following code.
1706 1689
    ///\code
1707 1690
    ///   b.init();
1708 1691
    ///   b.addSource(s);
1709 1692
    ///   b.start(t);
1710 1693
    ///\endcode
1711 1694
    bool run(Node s,Node t) {
1712 1695
      init();
1713 1696
      addSource(s);
1714 1697
      start(t);
1715 1698
      return reached(t);
1716 1699
    }
1717 1700

	
1718 1701
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1719 1702
    ///
1720 1703
    /// This method runs the %BFS algorithm in order to
1721 1704
    /// compute the shortest path to each node.
1722 1705
    ///
1723 1706
    /// The algorithm computes
1724 1707
    /// - the shortest path tree (forest),
1725 1708
    /// - the distance of each node from the root(s).
1726 1709
    ///
1727 1710
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1728 1711
    ///\code
1729 1712
    ///  b.init();
1730 1713
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1731 1714
    ///    if (!b.reached(n)) {
1732 1715
    ///      b.addSource(n);
1733 1716
    ///      b.start();
1734 1717
    ///    }
1735 1718
    ///  }
1736 1719
    ///\endcode
1737 1720
    void run() {
1738 1721
      init();
1739 1722
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1740 1723
        if (!reached(it)) {
1741 1724
          addSource(it);
1742 1725
          start();
1743 1726
        }
1744 1727
      }
1745 1728
    }
1746 1729

	
1747 1730
    ///@}
1748 1731

	
1749 1732
    /// \name Query Functions
1750 1733
    /// The result of the %BFS algorithm can be obtained using these
1751 1734
    /// functions.\n
1752 1735
    /// Either \ref lemon::BfsVisit::run() "run()" or
1753 1736
    /// \ref lemon::BfsVisit::start() "start()" must be called before
1754 1737
    /// using them.
1755 1738
    ///@{
1756 1739

	
1757 1740
    /// \brief Checks if a node is reachable from the root(s).
1758 1741
    ///
1759 1742
    /// Returns \c true if \c v is reachable from the root(s).
1760 1743
    /// \pre Either \ref run() or \ref start()
1761 1744
    /// must be called before using this function.
1762 1745
    bool reached(Node v) { return (*_reached)[v]; }
1763 1746

	
1764 1747
    ///@}
1765 1748

	
1766 1749
  };
1767 1750

	
1768 1751
} //END OF NAMESPACE LEMON
1769 1752

	
1770 1753
#endif
Ignore white space 2097152 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup concept
20 20
///\file
21 21
///\brief The concept of heaps.
22 22

	
23 23
#ifndef LEMON_CONCEPT_HEAP_H
24 24
#define LEMON_CONCEPT_HEAP_H
25 25

	
26 26
#include <lemon/core.h>
27 27

	
28 28
namespace lemon {
29 29

	
30 30
  namespace concepts {
31 31

	
32 32
    /// \addtogroup concept
33 33
    /// @{
34 34

	
35 35
    /// \brief The heap concept.
36 36
    ///
37 37
    /// Concept class describing the main interface of heaps.
38 38
    template <typename Priority, typename ItemIntMap>
39 39
    class Heap {
40 40
    public:
41 41

	
42 42
      /// Type of the items stored in the heap.
43 43
      typedef typename ItemIntMap::Key Item;
44 44

	
45 45
      /// Type of the priorities.
46 46
      typedef Priority Prio;
47 47

	
48 48
      /// \brief Type to represent the states of the items.
49 49
      ///
50 50
      /// Each item has a state associated to it. It can be "in heap",
51 51
      /// "pre heap" or "post heap". The later two are indifferent
52 52
      /// from the point of view of the heap, but may be useful for
53 53
      /// the user.
54 54
      ///
55 55
      /// The \c ItemIntMap must be initialized in such a way, that it
56 56
      /// assigns \c PRE_HEAP (<tt>-1</tt>) to every item.
57 57
      enum State {
58 58
        IN_HEAP = 0,
59 59
        PRE_HEAP = -1,
60 60
        POST_HEAP = -2
61 61
      };
62 62

	
63 63
      /// \brief The constructor.
64 64
      ///
65 65
      /// The constructor.
66 66
      /// \param map A map that assigns \c int values to keys of type
67 67
      /// \c Item. It is used internally by the heap implementations to
68 68
      /// handle the cross references. The assigned value must be
69 69
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
70 70
      explicit Heap(ItemIntMap &map) {}
71 71

	
72 72
      /// \brief The number of items stored in the heap.
73 73
      ///
74 74
      /// Returns the number of items stored in the heap.
75 75
      int size() const { return 0; }
76 76

	
77 77
      /// \brief Checks if the heap is empty.
78 78
      ///
79 79
      /// Returns \c true if the heap is empty.
80 80
      bool empty() const { return false; }
81 81

	
82 82
      /// \brief Makes the heap empty.
83 83
      ///
84 84
      /// Makes the heap empty.
85 85
      void clear();
86 86

	
87 87
      /// \brief Inserts an item into the heap with the given priority.
88 88
      ///
89 89
      /// Inserts the given item into the heap with the given priority.
90 90
      /// \param i The item to insert.
91 91
      /// \param p The priority of the item.
92 92
      void push(const Item &i, const Prio &p) {}
93 93

	
94 94
      /// \brief Returns the item having minimum priority.
95 95
      ///
96 96
      /// Returns the item having minimum priority.
97 97
      /// \pre The heap must be non-empty.
98 98
      Item top() const {}
99 99

	
100 100
      /// \brief The minimum priority.
101 101
      ///
102 102
      /// Returns the minimum priority.
103 103
      /// \pre The heap must be non-empty.
104 104
      Prio prio() const {}
105 105

	
106 106
      /// \brief Removes the item having minimum priority.
107 107
      ///
108 108
      /// Removes the item having minimum priority.
109 109
      /// \pre The heap must be non-empty.
110 110
      void pop() {}
111 111

	
112 112
      /// \brief Removes an item from the heap.
113 113
      ///
114 114
      /// Removes the given item from the heap if it is already stored.
115 115
      /// \param i The item to delete.
116 116
      void erase(const Item &i) {}
117 117

	
118 118
      /// \brief The priority of an item.
119 119
      ///
120 120
      /// Returns the priority of the given item.
121 121
      /// \pre \c i must be in the heap.
122 122
      /// \param i The item.
123 123
      Prio operator[](const Item &i) const {}
124 124

	
125 125
      /// \brief Sets the priority of an item or inserts it, if it is
126 126
      /// not stored in the heap.
127 127
      ///
128 128
      /// This method sets the priority of the given item if it is
129 129
      /// already stored in the heap.
130 130
      /// Otherwise it inserts the given item with the given priority.
131 131
      ///
132
      /// It may throw an \ref UnderflowPriorityException.
133 132
      /// \param i The item.
134 133
      /// \param p The priority.
135 134
      void set(const Item &i, const Prio &p) {}
136 135

	
137 136
      /// \brief Decreases the priority of an item to the given value.
138 137
      ///
139 138
      /// Decreases the priority of an item to the given value.
140 139
      /// \pre \c i must be stored in the heap with priority at least \c p.
141 140
      /// \param i The item.
142 141
      /// \param p The priority.
143 142
      void decrease(const Item &i, const Prio &p) {}
144 143

	
145 144
      /// \brief Increases the priority of an item to the given value.
146 145
      ///
147 146
      /// Increases the priority of an item to the given value.
148 147
      /// \pre \c i must be stored in the heap with priority at most \c p.
149 148
      /// \param i The item.
150 149
      /// \param p The priority.
151 150
      void increase(const Item &i, const Prio &p) {}
152 151

	
153 152
      /// \brief Returns if an item is in, has already been in, or has
154 153
      /// never been in the heap.
155 154
      ///
156 155
      /// This method returns \c PRE_HEAP if the given item has never
157 156
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
158 157
      /// and \c POST_HEAP otherwise.
159 158
      /// In the latter case it is possible that the item will get back
160 159
      /// to the heap again.
161 160
      /// \param i The item.
162 161
      State state(const Item &i) const {}
163 162

	
164 163
      /// \brief Sets the state of an item in the heap.
165 164
      ///
166 165
      /// Sets the state of the given item in the heap. It can be used
167 166
      /// to manually clear the heap when it is important to achive the
168 167
      /// better time complexity.
169 168
      /// \param i The item.
170 169
      /// \param st The state. It should not be \c IN_HEAP.
171 170
      void state(const Item& i, State st) {}
172 171

	
173 172

	
174 173
      template <typename _Heap>
175 174
      struct Constraints {
176 175
      public:
177 176
        void constraints() {
178 177
          typedef typename _Heap::Item OwnItem;
179 178
          typedef typename _Heap::Prio OwnPrio;
180 179
          typedef typename _Heap::State OwnState;
181 180

	
182 181
          Item item;
183 182
          Prio prio;
184 183
          item=Item();
185 184
          prio=Prio();
186 185
          ignore_unused_variable_warning(item);
187 186
          ignore_unused_variable_warning(prio);
188 187

	
189 188
          OwnItem own_item;
190 189
          OwnPrio own_prio;
191 190
          OwnState own_state;
192 191
          own_item=Item();
193 192
          own_prio=Prio();
194 193
          ignore_unused_variable_warning(own_item);
195 194
          ignore_unused_variable_warning(own_prio);
196 195
          ignore_unused_variable_warning(own_state);
197 196

	
198 197
          _Heap heap1(map);
199 198
          _Heap heap2 = heap1;
200 199
          ignore_unused_variable_warning(heap1);
201 200
          ignore_unused_variable_warning(heap2);
202 201

	
203 202
          int s = heap.size();
204 203
          ignore_unused_variable_warning(s);
205 204
          bool e = heap.empty();
206 205
          ignore_unused_variable_warning(e);
207 206

	
208 207
          prio = heap.prio();
209 208
          item = heap.top();
210 209
          prio = heap[item];
211 210
          own_prio = heap.prio();
212 211
          own_item = heap.top();
213 212
          own_prio = heap[own_item];
214 213

	
215 214
          heap.push(item, prio);
216 215
          heap.push(own_item, own_prio);
217 216
          heap.pop();
218 217

	
219 218
          heap.set(item, prio);
220 219
          heap.decrease(item, prio);
221 220
          heap.increase(item, prio);
222 221
          heap.set(own_item, own_prio);
223 222
          heap.decrease(own_item, own_prio);
224 223
          heap.increase(own_item, own_prio);
225 224

	
226 225
          heap.erase(item);
227 226
          heap.erase(own_item);
228 227
          heap.clear();
229 228

	
230 229
          own_state = heap.state(own_item);
231 230
          heap.state(own_item, own_state);
232 231

	
233 232
          own_state = _Heap::PRE_HEAP;
234 233
          own_state = _Heap::IN_HEAP;
235 234
          own_state = _Heap::POST_HEAP;
236 235
        }
237 236

	
238 237
        _Heap& heap;
239 238
        ItemIntMap& map;
240 239
      };
241 240
    };
242 241

	
243 242
    /// @}
244 243
  } // namespace lemon
245 244
}
246 245
#endif // LEMON_CONCEPT_PATH_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief DFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/assert.h>
31 31
#include <lemon/maps.h>
32 32
#include <lemon/path.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  ///Default traits class of Dfs class.
37 37

	
38 38
  ///Default traits class of Dfs class.
39 39
  ///\tparam GR Digraph type.
40 40
  template<class GR>
41 41
  struct DfsDefaultTraits
42 42
  {
43 43
    ///The type of the digraph the algorithm runs on.
44 44
    typedef GR Digraph;
45 45

	
46 46
    ///\brief The type of the map that stores the predecessor
47 47
    ///arcs of the %DFS paths.
48 48
    ///
49 49
    ///The type of the map that stores the predecessor
50 50
    ///arcs of the %DFS paths.
51 51
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 52
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
53 53
    ///Instantiates a \ref PredMap.
54 54

	
55 55
    ///This function instantiates a \ref PredMap.
56 56
    ///\param g is the digraph, to which we would like to define the
57 57
    ///\ref PredMap.
58 58
    static PredMap *createPredMap(const Digraph &g)
59 59
    {
60 60
      return new PredMap(g);
61 61
    }
62 62

	
63 63
    ///The type of the map that indicates which nodes are processed.
64 64

	
65 65
    ///The type of the map that indicates which nodes are processed.
66 66
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \ref ProcessedMap.
69 69

	
70 70
    ///This function instantiates a \ref ProcessedMap.
71 71
    ///\param g is the digraph, to which
72 72
    ///we would like to define the \ref ProcessedMap
73 73
#ifdef DOXYGEN
74 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
75 75
#else
76 76
    static ProcessedMap *createProcessedMap(const Digraph &)
77 77
#endif
78 78
    {
79 79
      return new ProcessedMap();
80 80
    }
81 81

	
82 82
    ///The type of the map that indicates which nodes are reached.
83 83

	
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 87
    ///Instantiates a \ref ReachedMap.
88 88

	
89 89
    ///This function instantiates a \ref ReachedMap.
90 90
    ///\param g is the digraph, to which
91 91
    ///we would like to define the \ref ReachedMap.
92 92
    static ReachedMap *createReachedMap(const Digraph &g)
93 93
    {
94 94
      return new ReachedMap(g);
95 95
    }
96 96

	
97 97
    ///The type of the map that stores the distances of the nodes.
98 98

	
99 99
    ///The type of the map that stores the distances of the nodes.
100 100
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101 101
    typedef typename Digraph::template NodeMap<int> DistMap;
102 102
    ///Instantiates a \ref DistMap.
103 103

	
104 104
    ///This function instantiates a \ref DistMap.
105 105
    ///\param g is the digraph, to which we would like to define the
106 106
    ///\ref DistMap.
107 107
    static DistMap *createDistMap(const Digraph &g)
108 108
    {
109 109
      return new DistMap(g);
110 110
    }
111 111
  };
112 112

	
113 113
  ///%DFS algorithm class.
114 114

	
115 115
  ///\ingroup search
116 116
  ///This class provides an efficient implementation of the %DFS algorithm.
117 117
  ///
118 118
  ///There is also a \ref dfs() "function-type interface" for the DFS
119 119
  ///algorithm, which is convenient in the simplier cases and it can be
120 120
  ///used easier.
121 121
  ///
122 122
  ///\tparam GR The type of the digraph the algorithm runs on.
123 123
  ///The default value is \ref ListDigraph. The value of GR is not used
124 124
  ///directly by \ref Dfs, it is only passed to \ref DfsDefaultTraits.
125 125
  ///\tparam TR Traits class to set various data types used by the algorithm.
126 126
  ///The default traits class is
127 127
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
128 128
  ///See \ref DfsDefaultTraits for the documentation of
129 129
  ///a Dfs traits class.
130 130
#ifdef DOXYGEN
131 131
  template <typename GR,
132 132
            typename TR>
133 133
#else
134 134
  template <typename GR=ListDigraph,
135 135
            typename TR=DfsDefaultTraits<GR> >
136 136
#endif
137 137
  class Dfs {
138 138
  public:
139
    ///\ref Exception for uninitialized parameters.
140

	
141
    ///This error represents problems in the initialization of the
142
    ///parameters of the algorithm.
143
    class UninitializedParameter : public lemon::UninitializedParameter {
144
    public:
145
      virtual const char* what() const throw() {
146
        return "lemon::Dfs::UninitializedParameter";
147
      }
148
    };
149 139

	
150 140
    ///The type of the digraph the algorithm runs on.
151 141
    typedef typename TR::Digraph Digraph;
152 142

	
153 143
    ///\brief The type of the map that stores the predecessor arcs of the
154 144
    ///DFS paths.
155 145
    typedef typename TR::PredMap PredMap;
156 146
    ///The type of the map that stores the distances of the nodes.
157 147
    typedef typename TR::DistMap DistMap;
158 148
    ///The type of the map that indicates which nodes are reached.
159 149
    typedef typename TR::ReachedMap ReachedMap;
160 150
    ///The type of the map that indicates which nodes are processed.
161 151
    typedef typename TR::ProcessedMap ProcessedMap;
162 152
    ///The type of the paths.
163 153
    typedef PredMapPath<Digraph, PredMap> Path;
164 154

	
165 155
    ///The traits class.
166 156
    typedef TR Traits;
167 157

	
168 158
  private:
169 159

	
170 160
    typedef typename Digraph::Node Node;
171 161
    typedef typename Digraph::NodeIt NodeIt;
172 162
    typedef typename Digraph::Arc Arc;
173 163
    typedef typename Digraph::OutArcIt OutArcIt;
174 164

	
175 165
    //Pointer to the underlying digraph.
176 166
    const Digraph *G;
177 167
    //Pointer to the map of predecessor arcs.
178 168
    PredMap *_pred;
179 169
    //Indicates if _pred is locally allocated (true) or not.
180 170
    bool local_pred;
181 171
    //Pointer to the map of distances.
182 172
    DistMap *_dist;
183 173
    //Indicates if _dist is locally allocated (true) or not.
184 174
    bool local_dist;
185 175
    //Pointer to the map of reached status of the nodes.
186 176
    ReachedMap *_reached;
187 177
    //Indicates if _reached is locally allocated (true) or not.
188 178
    bool local_reached;
189 179
    //Pointer to the map of processed status of the nodes.
190 180
    ProcessedMap *_processed;
191 181
    //Indicates if _processed is locally allocated (true) or not.
192 182
    bool local_processed;
193 183

	
194 184
    std::vector<typename Digraph::OutArcIt> _stack;
195 185
    int _stack_head;
196 186

	
197 187
    //Creates the maps if necessary.
198 188
    void create_maps()
199 189
    {
200 190
      if(!_pred) {
201 191
        local_pred = true;
202 192
        _pred = Traits::createPredMap(*G);
203 193
      }
204 194
      if(!_dist) {
205 195
        local_dist = true;
206 196
        _dist = Traits::createDistMap(*G);
207 197
      }
208 198
      if(!_reached) {
209 199
        local_reached = true;
210 200
        _reached = Traits::createReachedMap(*G);
211 201
      }
212 202
      if(!_processed) {
213 203
        local_processed = true;
214 204
        _processed = Traits::createProcessedMap(*G);
215 205
      }
216 206
    }
217 207

	
218 208
  protected:
219 209

	
220 210
    Dfs() {}
221 211

	
222 212
  public:
223 213

	
224 214
    typedef Dfs Create;
225 215

	
226 216
    ///\name Named template parameters
227 217

	
228 218
    ///@{
229 219

	
230 220
    template <class T>
231 221
    struct SetPredMapTraits : public Traits {
232 222
      typedef T PredMap;
233 223
      static PredMap *createPredMap(const Digraph &)
234 224
      {
235
        throw UninitializedParameter();
225
        LEMON_ASSERT(false, "PredMap is not initialized");
226
        return 0; // ignore warnings
236 227
      }
237 228
    };
238 229
    ///\brief \ref named-templ-param "Named parameter" for setting
239 230
    ///\ref PredMap type.
240 231
    ///
241 232
    ///\ref named-templ-param "Named parameter" for setting
242 233
    ///\ref PredMap type.
243 234
    template <class T>
244 235
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
245 236
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
246 237
    };
247 238

	
248 239
    template <class T>
249 240
    struct SetDistMapTraits : public Traits {
250 241
      typedef T DistMap;
251 242
      static DistMap *createDistMap(const Digraph &)
252 243
      {
253
        throw UninitializedParameter();
244
        LEMON_ASSERT(false, "DistMap is not initialized");
245
        return 0; // ignore warnings
254 246
      }
255 247
    };
256 248
    ///\brief \ref named-templ-param "Named parameter" for setting
257 249
    ///\ref DistMap type.
258 250
    ///
259 251
    ///\ref named-templ-param "Named parameter" for setting
260 252
    ///\ref DistMap type.
261 253
    template <class T>
262 254
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
263 255
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
264 256
    };
265 257

	
266 258
    template <class T>
267 259
    struct SetReachedMapTraits : public Traits {
268 260
      typedef T ReachedMap;
269 261
      static ReachedMap *createReachedMap(const Digraph &)
270 262
      {
271
        throw UninitializedParameter();
263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264
        return 0; // ignore warnings
272 265
      }
273 266
    };
274 267
    ///\brief \ref named-templ-param "Named parameter" for setting
275 268
    ///\ref ReachedMap type.
276 269
    ///
277 270
    ///\ref named-templ-param "Named parameter" for setting
278 271
    ///\ref ReachedMap type.
279 272
    template <class T>
280 273
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
281 274
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
282 275
    };
283 276

	
284 277
    template <class T>
285 278
    struct SetProcessedMapTraits : public Traits {
286 279
      typedef T ProcessedMap;
287 280
      static ProcessedMap *createProcessedMap(const Digraph &)
288 281
      {
289
        throw UninitializedParameter();
282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283
        return 0; // ignore warnings
290 284
      }
291 285
    };
292 286
    ///\brief \ref named-templ-param "Named parameter" for setting
293 287
    ///\ref ProcessedMap type.
294 288
    ///
295 289
    ///\ref named-templ-param "Named parameter" for setting
296 290
    ///\ref ProcessedMap type.
297 291
    template <class T>
298 292
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
299 293
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
300 294
    };
301 295

	
302 296
    struct SetStandardProcessedMapTraits : public Traits {
303 297
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
304 298
      static ProcessedMap *createProcessedMap(const Digraph &g)
305 299
      {
306 300
        return new ProcessedMap(g);
307 301
      }
308 302
    };
309 303
    ///\brief \ref named-templ-param "Named parameter" for setting
310 304
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
311 305
    ///
312 306
    ///\ref named-templ-param "Named parameter" for setting
313 307
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
314 308
    ///If you don't set it explicitly, it will be automatically allocated.
315 309
    struct SetStandardProcessedMap :
316 310
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
317 311
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
318 312
    };
319 313

	
320 314
    ///@}
321 315

	
322 316
  public:
323 317

	
324 318
    ///Constructor.
325 319

	
326 320
    ///Constructor.
327 321
    ///\param g The digraph the algorithm runs on.
328 322
    Dfs(const Digraph &g) :
329 323
      G(&g),
330 324
      _pred(NULL), local_pred(false),
331 325
      _dist(NULL), local_dist(false),
332 326
      _reached(NULL), local_reached(false),
333 327
      _processed(NULL), local_processed(false)
334 328
    { }
335 329

	
336 330
    ///Destructor.
337 331
    ~Dfs()
338 332
    {
339 333
      if(local_pred) delete _pred;
340 334
      if(local_dist) delete _dist;
341 335
      if(local_reached) delete _reached;
342 336
      if(local_processed) delete _processed;
343 337
    }
344 338

	
345 339
    ///Sets the map that stores the predecessor arcs.
346 340

	
347 341
    ///Sets the map that stores the predecessor arcs.
348 342
    ///If you don't use this function before calling \ref run(),
349 343
    ///it will allocate one. The destructor deallocates this
350 344
    ///automatically allocated map, of course.
351 345
    ///\return <tt> (*this) </tt>
352 346
    Dfs &predMap(PredMap &m)
353 347
    {
354 348
      if(local_pred) {
355 349
        delete _pred;
356 350
        local_pred=false;
357 351
      }
358 352
      _pred = &m;
359 353
      return *this;
360 354
    }
361 355

	
362 356
    ///Sets the map that indicates which nodes are reached.
363 357

	
364 358
    ///Sets the map that indicates which nodes are reached.
365 359
    ///If you don't use this function before calling \ref run(),
366 360
    ///it will allocate one. The destructor deallocates this
367 361
    ///automatically allocated map, of course.
368 362
    ///\return <tt> (*this) </tt>
369 363
    Dfs &reachedMap(ReachedMap &m)
370 364
    {
371 365
      if(local_reached) {
372 366
        delete _reached;
373 367
        local_reached=false;
374 368
      }
375 369
      _reached = &m;
376 370
      return *this;
377 371
    }
378 372

	
379 373
    ///Sets the map that indicates which nodes are processed.
380 374

	
381 375
    ///Sets the map that indicates which nodes are processed.
382 376
    ///If you don't use this function before calling \ref run(),
383 377
    ///it will allocate one. The destructor deallocates this
384 378
    ///automatically allocated map, of course.
385 379
    ///\return <tt> (*this) </tt>
386 380
    Dfs &processedMap(ProcessedMap &m)
387 381
    {
388 382
      if(local_processed) {
389 383
        delete _processed;
390 384
        local_processed=false;
391 385
      }
392 386
      _processed = &m;
393 387
      return *this;
394 388
    }
395 389

	
396 390
    ///Sets the map that stores the distances of the nodes.
397 391

	
398 392
    ///Sets the map that stores the distances of the nodes calculated by
399 393
    ///the algorithm.
400 394
    ///If you don't use this function before calling \ref run(),
401 395
    ///it will allocate one. The destructor deallocates this
402 396
    ///automatically allocated map, of course.
403 397
    ///\return <tt> (*this) </tt>
404 398
    Dfs &distMap(DistMap &m)
405 399
    {
406 400
      if(local_dist) {
407 401
        delete _dist;
408 402
        local_dist=false;
409 403
      }
410 404
      _dist = &m;
411 405
      return *this;
412 406
    }
413 407

	
414 408
  public:
415 409

	
416 410
    ///\name Execution control
417 411
    ///The simplest way to execute the algorithm is to use
418 412
    ///one of the member functions called \ref lemon::Dfs::run() "run()".
419 413
    ///\n
420 414
    ///If you need more control on the execution, first you must call
421 415
    ///\ref lemon::Dfs::init() "init()", then you can add a source node
422 416
    ///with \ref lemon::Dfs::addSource() "addSource()".
423 417
    ///Finally \ref lemon::Dfs::start() "start()" will perform the
424 418
    ///actual path computation.
425 419

	
426 420
    ///@{
427 421

	
428 422
    ///Initializes the internal data structures.
429 423

	
430 424
    ///Initializes the internal data structures.
431 425
    ///
432 426
    void init()
433 427
    {
434 428
      create_maps();
435 429
      _stack.resize(countNodes(*G));
436 430
      _stack_head=-1;
437 431
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
438 432
        _pred->set(u,INVALID);
439 433
        _reached->set(u,false);
440 434
        _processed->set(u,false);
441 435
      }
442 436
    }
443 437

	
444 438
    ///Adds a new source node.
445 439

	
446 440
    ///Adds a new source node to the set of nodes to be processed.
447 441
    ///
448 442
    ///\pre The stack must be empty. (Otherwise the algorithm gives
449 443
    ///false results.)
450 444
    ///
451 445
    ///\warning Distances will be wrong (or at least strange) in case of
452 446
    ///multiple sources.
453 447
    void addSource(Node s)
454 448
    {
455 449
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
456 450
      if(!(*_reached)[s])
457 451
        {
458 452
          _reached->set(s,true);
459 453
          _pred->set(s,INVALID);
460 454
          OutArcIt e(*G,s);
461 455
          if(e!=INVALID) {
462 456
            _stack[++_stack_head]=e;
463 457
            _dist->set(s,_stack_head);
464 458
          }
465 459
          else {
466 460
            _processed->set(s,true);
467 461
            _dist->set(s,0);
468 462
          }
469 463
        }
470 464
    }
471 465

	
472 466
    ///Processes the next arc.
473 467

	
474 468
    ///Processes the next arc.
475 469
    ///
476 470
    ///\return The processed arc.
477 471
    ///
478 472
    ///\pre The stack must not be empty.
479 473
    Arc processNextArc()
480 474
    {
481 475
      Node m;
482 476
      Arc e=_stack[_stack_head];
483 477
      if(!(*_reached)[m=G->target(e)]) {
484 478
        _pred->set(m,e);
485 479
        _reached->set(m,true);
486 480
        ++_stack_head;
487 481
        _stack[_stack_head] = OutArcIt(*G, m);
488 482
        _dist->set(m,_stack_head);
489 483
      }
490 484
      else {
491 485
        m=G->source(e);
492 486
        ++_stack[_stack_head];
493 487
      }
494 488
      while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
495 489
        _processed->set(m,true);
496 490
        --_stack_head;
497 491
        if(_stack_head>=0) {
498 492
          m=G->source(_stack[_stack_head]);
499 493
          ++_stack[_stack_head];
500 494
        }
501 495
      }
502 496
      return e;
503 497
    }
504 498

	
505 499
    ///Next arc to be processed.
506 500

	
507 501
    ///Next arc to be processed.
508 502
    ///
509 503
    ///\return The next arc to be processed or \c INVALID if the stack
510 504
    ///is empty.
511 505
    OutArcIt nextArc() const
512 506
    {
513 507
      return _stack_head>=0?_stack[_stack_head]:INVALID;
514 508
    }
515 509

	
516 510
    ///\brief Returns \c false if there are nodes
517 511
    ///to be processed.
518 512
    ///
519 513
    ///Returns \c false if there are nodes
520 514
    ///to be processed in the queue (stack).
521 515
    bool emptyQueue() const { return _stack_head<0; }
522 516

	
523 517
    ///Returns the number of the nodes to be processed.
524 518

	
525 519
    ///Returns the number of the nodes to be processed in the queue (stack).
526 520
    int queueSize() const { return _stack_head+1; }
527 521

	
528 522
    ///Executes the algorithm.
529 523

	
530 524
    ///Executes the algorithm.
531 525
    ///
532 526
    ///This method runs the %DFS algorithm from the root node
533 527
    ///in order to compute the DFS path to each node.
534 528
    ///
535 529
    /// The algorithm computes
536 530
    ///- the %DFS tree,
537 531
    ///- the distance of each node from the root in the %DFS tree.
538 532
    ///
539 533
    ///\pre init() must be called and a root node should be
540 534
    ///added with addSource() before using this function.
541 535
    ///
542 536
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
543 537
    ///\code
544 538
    ///  while ( !d.emptyQueue() ) {
545 539
    ///    d.processNextArc();
546 540
    ///  }
547 541
    ///\endcode
548 542
    void start()
549 543
    {
550 544
      while ( !emptyQueue() ) processNextArc();
551 545
    }
552 546

	
553 547
    ///Executes the algorithm until the given target node is reached.
554 548

	
555 549
    ///Executes the algorithm until the given target node is reached.
556 550
    ///
557 551
    ///This method runs the %DFS algorithm from the root node
558 552
    ///in order to compute the DFS path to \c t.
559 553
    ///
560 554
    ///The algorithm computes
561 555
    ///- the %DFS path to \c t,
562 556
    ///- the distance of \c t from the root in the %DFS tree.
563 557
    ///
564 558
    ///\pre init() must be called and a root node should be
565 559
    ///added with addSource() before using this function.
566 560
    void start(Node t)
567 561
    {
568 562
      while ( !emptyQueue() && G->target(_stack[_stack_head])!=t )
569 563
        processNextArc();
570 564
    }
571 565

	
572 566
    ///Executes the algorithm until a condition is met.
573 567

	
574 568
    ///Executes the algorithm until a condition is met.
575 569
    ///
576 570
    ///This method runs the %DFS algorithm from the root node
577 571
    ///until an arc \c a with <tt>am[a]</tt> true is found.
578 572
    ///
579 573
    ///\param am A \c bool (or convertible) arc map. The algorithm
580 574
    ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
581 575
    ///
582 576
    ///\return The reached arc \c a with <tt>am[a]</tt> true or
583 577
    ///\c INVALID if no such arc was found.
584 578
    ///
585 579
    ///\pre init() must be called and a root node should be
586 580
    ///added with addSource() before using this function.
587 581
    ///
588 582
    ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
589 583
    ///not a node map.
590 584
    template<class ArcBoolMap>
591 585
    Arc start(const ArcBoolMap &am)
592 586
    {
593 587
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
594 588
        processNextArc();
595 589
      return emptyQueue() ? INVALID : _stack[_stack_head];
596 590
    }
597 591

	
598 592
    ///Runs the algorithm from the given source node.
599 593

	
600 594
    ///This method runs the %DFS algorithm from node \c s
601 595
    ///in order to compute the DFS path to each node.
602 596
    ///
603 597
    ///The algorithm computes
604 598
    ///- the %DFS tree,
605 599
    ///- the distance of each node from the root in the %DFS tree.
606 600
    ///
607 601
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
608 602
    ///\code
609 603
    ///  d.init();
610 604
    ///  d.addSource(s);
611 605
    ///  d.start();
612 606
    ///\endcode
613 607
    void run(Node s) {
614 608
      init();
615 609
      addSource(s);
616 610
      start();
617 611
    }
618 612

	
619 613
    ///Finds the %DFS path between \c s and \c t.
620 614

	
621 615
    ///This method runs the %DFS algorithm from node \c s
622 616
    ///in order to compute the DFS path to node \c t
623 617
    ///(it stops searching when \c t is processed)
624 618
    ///
625 619
    ///\return \c true if \c t is reachable form \c s.
626 620
    ///
627 621
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
628 622
    ///just a shortcut of the following code.
629 623
    ///\code
630 624
    ///  d.init();
631 625
    ///  d.addSource(s);
632 626
    ///  d.start(t);
633 627
    ///\endcode
634 628
    bool run(Node s,Node t) {
635 629
      init();
636 630
      addSource(s);
637 631
      start(t);
638 632
      return reached(t);
639 633
    }
640 634

	
641 635
    ///Runs the algorithm to visit all nodes in the digraph.
642 636

	
643 637
    ///This method runs the %DFS algorithm in order to compute the
644 638
    ///%DFS path to each node.
645 639
    ///
646 640
    ///The algorithm computes
647 641
    ///- the %DFS tree,
648 642
    ///- the distance of each node from the root in the %DFS tree.
649 643
    ///
650 644
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
651 645
    ///\code
652 646
    ///  d.init();
653 647
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
654 648
    ///    if (!d.reached(n)) {
655 649
    ///      d.addSource(n);
656 650
    ///      d.start();
657 651
    ///    }
658 652
    ///  }
659 653
    ///\endcode
660 654
    void run() {
661 655
      init();
662 656
      for (NodeIt it(*G); it != INVALID; ++it) {
663 657
        if (!reached(it)) {
664 658
          addSource(it);
665 659
          start();
666 660
        }
667 661
      }
668 662
    }
669 663

	
670 664
    ///@}
671 665

	
672 666
    ///\name Query Functions
673 667
    ///The result of the %DFS algorithm can be obtained using these
674 668
    ///functions.\n
675 669
    ///Either \ref lemon::Dfs::run() "run()" or \ref lemon::Dfs::start()
676 670
    ///"start()" must be called before using them.
677 671

	
678 672
    ///@{
679 673

	
680 674
    ///The DFS path to a node.
681 675

	
682 676
    ///Returns the DFS path to a node.
683 677
    ///
684 678
    ///\warning \c t should be reachable from the root.
685 679
    ///
686 680
    ///\pre Either \ref run() or \ref start() must be called before
687 681
    ///using this function.
688 682
    Path path(Node t) const { return Path(*G, *_pred, t); }
689 683

	
690 684
    ///The distance of a node from the root.
691 685

	
692 686
    ///Returns the distance of a node from the root.
693 687
    ///
694 688
    ///\warning If node \c v is not reachable from the root, then
695 689
    ///the return value of this function is undefined.
696 690
    ///
697 691
    ///\pre Either \ref run() or \ref start() must be called before
698 692
    ///using this function.
699 693
    int dist(Node v) const { return (*_dist)[v]; }
700 694

	
701 695
    ///Returns the 'previous arc' of the %DFS tree for a node.
702 696

	
703 697
    ///This function returns the 'previous arc' of the %DFS tree for the
704 698
    ///node \c v, i.e. it returns the last arc of a %DFS path from the
705 699
    ///root to \c v. It is \c INVALID
706 700
    ///if \c v is not reachable from the root(s) or if \c v is a root.
707 701
    ///
708 702
    ///The %DFS tree used here is equal to the %DFS tree used in
709 703
    ///\ref predNode().
710 704
    ///
711 705
    ///\pre Either \ref run() or \ref start() must be called before using
712 706
    ///this function.
713 707
    Arc predArc(Node v) const { return (*_pred)[v];}
714 708

	
715 709
    ///Returns the 'previous node' of the %DFS tree.
716 710

	
717 711
    ///This function returns the 'previous node' of the %DFS
718 712
    ///tree for the node \c v, i.e. it returns the last but one node
719 713
    ///from a %DFS path from the root to \c v. It is \c INVALID
720 714
    ///if \c v is not reachable from the root(s) or if \c v is a root.
721 715
    ///
722 716
    ///The %DFS tree used here is equal to the %DFS tree used in
723 717
    ///\ref predArc().
724 718
    ///
725 719
    ///\pre Either \ref run() or \ref start() must be called before
726 720
    ///using this function.
727 721
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
728 722
                                  G->source((*_pred)[v]); }
729 723

	
730 724
    ///\brief Returns a const reference to the node map that stores the
731 725
    ///distances of the nodes.
732 726
    ///
733 727
    ///Returns a const reference to the node map that stores the
734 728
    ///distances of the nodes calculated by the algorithm.
735 729
    ///
736 730
    ///\pre Either \ref run() or \ref init()
737 731
    ///must be called before using this function.
738 732
    const DistMap &distMap() const { return *_dist;}
739 733

	
740 734
    ///\brief Returns a const reference to the node map that stores the
741 735
    ///predecessor arcs.
742 736
    ///
743 737
    ///Returns a const reference to the node map that stores the predecessor
744 738
    ///arcs, which form the DFS tree.
745 739
    ///
746 740
    ///\pre Either \ref run() or \ref init()
747 741
    ///must be called before using this function.
748 742
    const PredMap &predMap() const { return *_pred;}
749 743

	
750 744
    ///Checks if a node is reachable from the root(s).
751 745

	
752 746
    ///Returns \c true if \c v is reachable from the root(s).
753 747
    ///\pre Either \ref run() or \ref start()
754 748
    ///must be called before using this function.
755 749
    bool reached(Node v) const { return (*_reached)[v]; }
756 750

	
757 751
    ///@}
758 752
  };
759 753

	
760 754
  ///Default traits class of dfs() function.
761 755

	
762 756
  ///Default traits class of dfs() function.
763 757
  ///\tparam GR Digraph type.
764 758
  template<class GR>
765 759
  struct DfsWizardDefaultTraits
766 760
  {
767 761
    ///The type of the digraph the algorithm runs on.
768 762
    typedef GR Digraph;
769 763

	
770 764
    ///\brief The type of the map that stores the predecessor
771 765
    ///arcs of the %DFS paths.
772 766
    ///
773 767
    ///The type of the map that stores the predecessor
774 768
    ///arcs of the %DFS paths.
775 769
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
776 770
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
777 771
    ///Instantiates a \ref PredMap.
778 772

	
779 773
    ///This function instantiates a \ref PredMap.
780 774
    ///\param g is the digraph, to which we would like to define the
781 775
    ///\ref PredMap.
782 776
    static PredMap *createPredMap(const Digraph &g)
783 777
    {
784 778
      return new PredMap(g);
785 779
    }
786 780

	
787 781
    ///The type of the map that indicates which nodes are processed.
788 782

	
789 783
    ///The type of the map that indicates which nodes are processed.
790 784
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
791 785
    ///By default it is a NullMap.
792 786
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
793 787
    ///Instantiates a \ref ProcessedMap.
794 788

	
795 789
    ///This function instantiates a \ref ProcessedMap.
796 790
    ///\param g is the digraph, to which
797 791
    ///we would like to define the \ref ProcessedMap.
798 792
#ifdef DOXYGEN
799 793
    static ProcessedMap *createProcessedMap(const Digraph &g)
800 794
#else
801 795
    static ProcessedMap *createProcessedMap(const Digraph &)
802 796
#endif
803 797
    {
804 798
      return new ProcessedMap();
805 799
    }
806 800

	
807 801
    ///The type of the map that indicates which nodes are reached.
808 802

	
809 803
    ///The type of the map that indicates which nodes are reached.
810 804
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
811 805
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
812 806
    ///Instantiates a \ref ReachedMap.
813 807

	
814 808
    ///This function instantiates a \ref ReachedMap.
815 809
    ///\param g is the digraph, to which
816 810
    ///we would like to define the \ref ReachedMap.
817 811
    static ReachedMap *createReachedMap(const Digraph &g)
818 812
    {
819 813
      return new ReachedMap(g);
820 814
    }
821 815

	
822 816
    ///The type of the map that stores the distances of the nodes.
823 817

	
824 818
    ///The type of the map that stores the distances of the nodes.
825 819
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
826 820
    typedef typename Digraph::template NodeMap<int> DistMap;
827 821
    ///Instantiates a \ref DistMap.
828 822

	
829 823
    ///This function instantiates a \ref DistMap.
830 824
    ///\param g is the digraph, to which we would like to define
831 825
    ///the \ref DistMap
832 826
    static DistMap *createDistMap(const Digraph &g)
833 827
    {
834 828
      return new DistMap(g);
835 829
    }
836 830

	
837 831
    ///The type of the DFS paths.
838 832

	
839 833
    ///The type of the DFS paths.
840 834
    ///It must meet the \ref concepts::Path "Path" concept.
841 835
    typedef lemon::Path<Digraph> Path;
842 836
  };
843 837

	
844 838
  /// Default traits class used by \ref DfsWizard
845 839

	
846 840
  /// To make it easier to use Dfs algorithm
847 841
  /// we have created a wizard class.
848 842
  /// This \ref DfsWizard class needs default traits,
849 843
  /// as well as the \ref Dfs class.
850 844
  /// The \ref DfsWizardBase is a class to be the default traits of the
851 845
  /// \ref DfsWizard class.
852 846
  template<class GR>
853 847
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
854 848
  {
855 849

	
856 850
    typedef DfsWizardDefaultTraits<GR> Base;
857 851
  protected:
858 852
    //The type of the nodes in the digraph.
859 853
    typedef typename Base::Digraph::Node Node;
860 854

	
861 855
    //Pointer to the digraph the algorithm runs on.
862 856
    void *_g;
863 857
    //Pointer to the map of reached nodes.
864 858
    void *_reached;
865 859
    //Pointer to the map of processed nodes.
866 860
    void *_processed;
867 861
    //Pointer to the map of predecessors arcs.
868 862
    void *_pred;
869 863
    //Pointer to the map of distances.
870 864
    void *_dist;
871 865
    //Pointer to the DFS path to the target node.
872 866
    void *_path;
873 867
    //Pointer to the distance of the target node.
874 868
    int *_di;
875 869

	
876 870
    public:
877 871
    /// Constructor.
878 872

	
879 873
    /// This constructor does not require parameters, therefore it initiates
880 874
    /// all of the attributes to \c 0.
881 875
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
882 876
                      _dist(0), _path(0), _di(0) {}
883 877

	
884 878
    /// Constructor.
885 879

	
886 880
    /// This constructor requires one parameter,
887 881
    /// others are initiated to \c 0.
888 882
    /// \param g The digraph the algorithm runs on.
889 883
    DfsWizardBase(const GR &g) :
890 884
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
891 885
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
892 886

	
893 887
  };
894 888

	
895 889
  /// Auxiliary class for the function-type interface of DFS algorithm.
896 890

	
897 891
  /// This auxiliary class is created to implement the
898 892
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
899 893
  /// It does not have own \ref run() method, it uses the functions
900 894
  /// and features of the plain \ref Dfs.
901 895
  ///
902 896
  /// This class should only be used through the \ref dfs() function,
903 897
  /// which makes it easier to use the algorithm.
904 898
  template<class TR>
905 899
  class DfsWizard : public TR
906 900
  {
907 901
    typedef TR Base;
908 902

	
909 903
    ///The type of the digraph the algorithm runs on.
910 904
    typedef typename TR::Digraph Digraph;
911 905

	
912 906
    typedef typename Digraph::Node Node;
913 907
    typedef typename Digraph::NodeIt NodeIt;
914 908
    typedef typename Digraph::Arc Arc;
915 909
    typedef typename Digraph::OutArcIt OutArcIt;
916 910

	
917 911
    ///\brief The type of the map that stores the predecessor
918 912
    ///arcs of the DFS paths.
919 913
    typedef typename TR::PredMap PredMap;
920 914
    ///\brief The type of the map that stores the distances of the nodes.
921 915
    typedef typename TR::DistMap DistMap;
922 916
    ///\brief The type of the map that indicates which nodes are reached.
923 917
    typedef typename TR::ReachedMap ReachedMap;
924 918
    ///\brief The type of the map that indicates which nodes are processed.
925 919
    typedef typename TR::ProcessedMap ProcessedMap;
926 920
    ///The type of the DFS paths
927 921
    typedef typename TR::Path Path;
928 922

	
929 923
  public:
930 924

	
931 925
    /// Constructor.
932 926
    DfsWizard() : TR() {}
933 927

	
934 928
    /// Constructor that requires parameters.
935 929

	
936 930
    /// Constructor that requires parameters.
937 931
    /// These parameters will be the default values for the traits class.
938 932
    /// \param g The digraph the algorithm runs on.
939 933
    DfsWizard(const Digraph &g) :
940 934
      TR(g) {}
941 935

	
942 936
    ///Copy constructor
943 937
    DfsWizard(const TR &b) : TR(b) {}
944 938

	
945 939
    ~DfsWizard() {}
946 940

	
947 941
    ///Runs DFS algorithm from the given source node.
948 942

	
949 943
    ///This method runs DFS algorithm from node \c s
950 944
    ///in order to compute the DFS path to each node.
951 945
    void run(Node s)
952 946
    {
953 947
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
954 948
      if (Base::_pred)
955 949
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
956 950
      if (Base::_dist)
957 951
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
958 952
      if (Base::_reached)
959 953
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
960 954
      if (Base::_processed)
961 955
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
962 956
      if (s!=INVALID)
963 957
        alg.run(s);
964 958
      else
965 959
        alg.run();
966 960
    }
967 961

	
968 962
    ///Finds the DFS path between \c s and \c t.
969 963

	
970 964
    ///This method runs DFS algorithm from node \c s
971 965
    ///in order to compute the DFS path to node \c t
972 966
    ///(it stops searching when \c t is processed).
973 967
    ///
974 968
    ///\return \c true if \c t is reachable form \c s.
975 969
    bool run(Node s, Node t)
976 970
    {
977
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
978 971
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
979 972
      if (Base::_pred)
980 973
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
981 974
      if (Base::_dist)
982 975
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
983 976
      if (Base::_reached)
984 977
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
985 978
      if (Base::_processed)
986 979
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
987 980
      alg.run(s,t);
988 981
      if (Base::_path)
989 982
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
990 983
      if (Base::_di)
991 984
        *Base::_di = alg.dist(t);
992 985
      return alg.reached(t);
993 986
      }
994 987

	
995 988
    ///Runs DFS algorithm to visit all nodes in the digraph.
996 989

	
997 990
    ///This method runs DFS algorithm in order to compute
998 991
    ///the DFS path to each node.
999 992
    void run()
1000 993
    {
1001 994
      run(INVALID);
1002 995
    }
1003 996

	
1004 997
    template<class T>
1005 998
    struct SetPredMapBase : public Base {
1006 999
      typedef T PredMap;
1007 1000
      static PredMap *createPredMap(const Digraph &) { return 0; };
1008 1001
      SetPredMapBase(const TR &b) : TR(b) {}
1009 1002
    };
1010 1003
    ///\brief \ref named-func-param "Named parameter"
1011 1004
    ///for setting \ref PredMap object.
1012 1005
    ///
1013 1006
    ///\ref named-func-param "Named parameter"
1014 1007
    ///for setting \ref PredMap object.
1015 1008
    template<class T>
1016 1009
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1017 1010
    {
1018 1011
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1019 1012
      return DfsWizard<SetPredMapBase<T> >(*this);
1020 1013
    }
1021 1014

	
1022 1015
    template<class T>
1023 1016
    struct SetReachedMapBase : public Base {
1024 1017
      typedef T ReachedMap;
1025 1018
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1026 1019
      SetReachedMapBase(const TR &b) : TR(b) {}
1027 1020
    };
1028 1021
    ///\brief \ref named-func-param "Named parameter"
1029 1022
    ///for setting \ref ReachedMap object.
1030 1023
    ///
1031 1024
    /// \ref named-func-param "Named parameter"
1032 1025
    ///for setting \ref ReachedMap object.
1033 1026
    template<class T>
1034 1027
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1035 1028
    {
1036 1029
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1037 1030
      return DfsWizard<SetReachedMapBase<T> >(*this);
1038 1031
    }
1039 1032

	
1040 1033
    template<class T>
1041 1034
    struct SetDistMapBase : public Base {
1042 1035
      typedef T DistMap;
1043 1036
      static DistMap *createDistMap(const Digraph &) { return 0; };
1044 1037
      SetDistMapBase(const TR &b) : TR(b) {}
1045 1038
    };
1046 1039
    ///\brief \ref named-func-param "Named parameter"
1047 1040
    ///for setting \ref DistMap object.
1048 1041
    ///
1049 1042
    /// \ref named-func-param "Named parameter"
1050 1043
    ///for setting \ref DistMap object.
1051 1044
    template<class T>
1052 1045
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1053 1046
    {
1054 1047
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1055 1048
      return DfsWizard<SetDistMapBase<T> >(*this);
1056 1049
    }
1057 1050

	
1058 1051
    template<class T>
1059 1052
    struct SetProcessedMapBase : public Base {
1060 1053
      typedef T ProcessedMap;
1061 1054
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1062 1055
      SetProcessedMapBase(const TR &b) : TR(b) {}
1063 1056
    };
1064 1057
    ///\brief \ref named-func-param "Named parameter"
1065 1058
    ///for setting \ref ProcessedMap object.
1066 1059
    ///
1067 1060
    /// \ref named-func-param "Named parameter"
1068 1061
    ///for setting \ref ProcessedMap object.
1069 1062
    template<class T>
1070 1063
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1071 1064
    {
1072 1065
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1073 1066
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1074 1067
    }
1075 1068

	
1076 1069
    template<class T>
1077 1070
    struct SetPathBase : public Base {
1078 1071
      typedef T Path;
1079 1072
      SetPathBase(const TR &b) : TR(b) {}
1080 1073
    };
1081 1074
    ///\brief \ref named-func-param "Named parameter"
1082 1075
    ///for getting the DFS path to the target node.
1083 1076
    ///
1084 1077
    ///\ref named-func-param "Named parameter"
1085 1078
    ///for getting the DFS path to the target node.
1086 1079
    template<class T>
1087 1080
    DfsWizard<SetPathBase<T> > path(const T &t)
1088 1081
    {
1089 1082
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1090 1083
      return DfsWizard<SetPathBase<T> >(*this);
1091 1084
    }
1092 1085

	
1093 1086
    ///\brief \ref named-func-param "Named parameter"
1094 1087
    ///for getting the distance of the target node.
1095 1088
    ///
1096 1089
    ///\ref named-func-param "Named parameter"
1097 1090
    ///for getting the distance of the target node.
1098 1091
    DfsWizard dist(const int &d)
1099 1092
    {
1100 1093
      Base::_di=const_cast<int*>(&d);
1101 1094
      return *this;
1102 1095
    }
1103 1096

	
1104 1097
  };
1105 1098

	
1106 1099
  ///Function-type interface for DFS algorithm.
1107 1100

	
1108 1101
  ///\ingroup search
1109 1102
  ///Function-type interface for DFS algorithm.
1110 1103
  ///
1111 1104
  ///This function also has several \ref named-func-param "named parameters",
1112 1105
  ///they are declared as the members of class \ref DfsWizard.
1113 1106
  ///The following examples show how to use these parameters.
1114 1107
  ///\code
1115 1108
  ///  // Compute the DFS tree
1116 1109
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1117 1110
  ///
1118 1111
  ///  // Compute the DFS path from s to t
1119 1112
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1120 1113
  ///\endcode
1121 1114

	
1122 1115
  ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1123 1116
  ///to the end of the parameter list.
1124 1117
  ///\sa DfsWizard
1125 1118
  ///\sa Dfs
1126 1119
  template<class GR>
1127 1120
  DfsWizard<DfsWizardBase<GR> >
1128 1121
  dfs(const GR &digraph)
1129 1122
  {
1130 1123
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1131 1124
  }
1132 1125

	
1133 1126
#ifdef DOXYGEN
1134 1127
  /// \brief Visitor class for DFS.
1135 1128
  ///
1136 1129
  /// This class defines the interface of the DfsVisit events, and
1137 1130
  /// it could be the base of a real visitor class.
1138 1131
  template <typename _Digraph>
1139 1132
  struct DfsVisitor {
1140 1133
    typedef _Digraph Digraph;
1141 1134
    typedef typename Digraph::Arc Arc;
1142 1135
    typedef typename Digraph::Node Node;
1143 1136
    /// \brief Called for the source node of the DFS.
1144 1137
    ///
1145 1138
    /// This function is called for the source node of the DFS.
1146 1139
    void start(const Node& node) {}
1147 1140
    /// \brief Called when the source node is leaved.
1148 1141
    ///
1149 1142
    /// This function is called when the source node is leaved.
1150 1143
    void stop(const Node& node) {}
1151 1144
    /// \brief Called when a node is reached first time.
1152 1145
    ///
1153 1146
    /// This function is called when a node is reached first time.
1154 1147
    void reach(const Node& node) {}
1155 1148
    /// \brief Called when an arc reaches a new node.
1156 1149
    ///
1157 1150
    /// This function is called when the DFS finds an arc whose target node
1158 1151
    /// is not reached yet.
1159 1152
    void discover(const Arc& arc) {}
1160 1153
    /// \brief Called when an arc is examined but its target node is
1161 1154
    /// already discovered.
1162 1155
    ///
1163 1156
    /// This function is called when an arc is examined but its target node is
1164 1157
    /// already discovered.
1165 1158
    void examine(const Arc& arc) {}
1166 1159
    /// \brief Called when the DFS steps back from a node.
1167 1160
    ///
1168 1161
    /// This function is called when the DFS steps back from a node.
1169 1162
    void leave(const Node& node) {}
1170 1163
    /// \brief Called when the DFS steps back on an arc.
1171 1164
    ///
1172 1165
    /// This function is called when the DFS steps back on an arc.
1173 1166
    void backtrack(const Arc& arc) {}
1174 1167
  };
1175 1168
#else
1176 1169
  template <typename _Digraph>
1177 1170
  struct DfsVisitor {
1178 1171
    typedef _Digraph Digraph;
1179 1172
    typedef typename Digraph::Arc Arc;
1180 1173
    typedef typename Digraph::Node Node;
1181 1174
    void start(const Node&) {}
1182 1175
    void stop(const Node&) {}
1183 1176
    void reach(const Node&) {}
1184 1177
    void discover(const Arc&) {}
1185 1178
    void examine(const Arc&) {}
1186 1179
    void leave(const Node&) {}
1187 1180
    void backtrack(const Arc&) {}
1188 1181

	
1189 1182
    template <typename _Visitor>
1190 1183
    struct Constraints {
1191 1184
      void constraints() {
1192 1185
        Arc arc;
1193 1186
        Node node;
1194 1187
        visitor.start(node);
1195 1188
        visitor.stop(arc);
1196 1189
        visitor.reach(node);
1197 1190
        visitor.discover(arc);
1198 1191
        visitor.examine(arc);
1199 1192
        visitor.leave(node);
1200 1193
        visitor.backtrack(arc);
1201 1194
      }
1202 1195
      _Visitor& visitor;
1203 1196
    };
1204 1197
  };
1205 1198
#endif
1206 1199

	
1207 1200
  /// \brief Default traits class of DfsVisit class.
1208 1201
  ///
1209 1202
  /// Default traits class of DfsVisit class.
1210 1203
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1211 1204
  template<class _Digraph>
1212 1205
  struct DfsVisitDefaultTraits {
1213 1206

	
1214 1207
    /// \brief The type of the digraph the algorithm runs on.
1215 1208
    typedef _Digraph Digraph;
1216 1209

	
1217 1210
    /// \brief The type of the map that indicates which nodes are reached.
1218 1211
    ///
1219 1212
    /// The type of the map that indicates which nodes are reached.
1220 1213
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1221 1214
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1222 1215

	
1223 1216
    /// \brief Instantiates a \ref ReachedMap.
1224 1217
    ///
1225 1218
    /// This function instantiates a \ref ReachedMap.
1226 1219
    /// \param digraph is the digraph, to which
1227 1220
    /// we would like to define the \ref ReachedMap.
1228 1221
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1229 1222
      return new ReachedMap(digraph);
1230 1223
    }
1231 1224

	
1232 1225
  };
1233 1226

	
1234 1227
  /// \ingroup search
1235 1228
  ///
1236 1229
  /// \brief %DFS algorithm class with visitor interface.
1237 1230
  ///
1238 1231
  /// This class provides an efficient implementation of the %DFS algorithm
1239 1232
  /// with visitor interface.
1240 1233
  ///
1241 1234
  /// The %DfsVisit class provides an alternative interface to the Dfs
1242 1235
  /// class. It works with callback mechanism, the DfsVisit object calls
1243 1236
  /// the member functions of the \c Visitor class on every DFS event.
1244 1237
  ///
1245 1238
  /// This interface of the DFS algorithm should be used in special cases
1246 1239
  /// when extra actions have to be performed in connection with certain
1247 1240
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1248 1241
  /// instead.
1249 1242
  ///
1250 1243
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1251 1244
  /// The default value is
1252 1245
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1253 1246
  /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits.
1254 1247
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1255 1248
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which
1256 1249
  /// does not observe the DFS events. If you want to observe the DFS
1257 1250
  /// events, you should implement your own visitor class.
1258 1251
  /// \tparam _Traits Traits class to set various data types used by the
1259 1252
  /// algorithm. The default traits class is
1260 1253
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1261 1254
  /// See \ref DfsVisitDefaultTraits for the documentation of
1262 1255
  /// a DFS visit traits class.
1263 1256
#ifdef DOXYGEN
1264 1257
  template <typename _Digraph, typename _Visitor, typename _Traits>
1265 1258
#else
1266 1259
  template <typename _Digraph = ListDigraph,
1267 1260
            typename _Visitor = DfsVisitor<_Digraph>,
1268 1261
            typename _Traits = DfsVisitDefaultTraits<_Digraph> >
1269 1262
#endif
1270 1263
  class DfsVisit {
1271 1264
  public:
1272 1265

	
1273
    /// \brief \ref Exception for uninitialized parameters.
1274
    ///
1275
    /// This error represents problems in the initialization
1276
    /// of the parameters of the algorithm.
1277
    class UninitializedParameter : public lemon::UninitializedParameter {
1278
    public:
1279
      virtual const char* what() const throw()
1280
      {
1281
        return "lemon::DfsVisit::UninitializedParameter";
1282
      }
1283
    };
1284

	
1285 1266
    ///The traits class.
1286 1267
    typedef _Traits Traits;
1287 1268

	
1288 1269
    ///The type of the digraph the algorithm runs on.
1289 1270
    typedef typename Traits::Digraph Digraph;
1290 1271

	
1291 1272
    ///The visitor type used by the algorithm.
1292 1273
    typedef _Visitor Visitor;
1293 1274

	
1294 1275
    ///The type of the map that indicates which nodes are reached.
1295 1276
    typedef typename Traits::ReachedMap ReachedMap;
1296 1277

	
1297 1278
  private:
1298 1279

	
1299 1280
    typedef typename Digraph::Node Node;
1300 1281
    typedef typename Digraph::NodeIt NodeIt;
1301 1282
    typedef typename Digraph::Arc Arc;
1302 1283
    typedef typename Digraph::OutArcIt OutArcIt;
1303 1284

	
1304 1285
    //Pointer to the underlying digraph.
1305 1286
    const Digraph *_digraph;
1306 1287
    //Pointer to the visitor object.
1307 1288
    Visitor *_visitor;
1308 1289
    //Pointer to the map of reached status of the nodes.
1309 1290
    ReachedMap *_reached;
1310 1291
    //Indicates if _reached is locally allocated (true) or not.
1311 1292
    bool local_reached;
1312 1293

	
1313 1294
    std::vector<typename Digraph::Arc> _stack;
1314 1295
    int _stack_head;
1315 1296

	
1316 1297
    //Creates the maps if necessary.
1317 1298
    void create_maps() {
1318 1299
      if(!_reached) {
1319 1300
        local_reached = true;
1320 1301
        _reached = Traits::createReachedMap(*_digraph);
1321 1302
      }
1322 1303
    }
1323 1304

	
1324 1305
  protected:
1325 1306

	
1326 1307
    DfsVisit() {}
1327 1308

	
1328 1309
  public:
1329 1310

	
1330 1311
    typedef DfsVisit Create;
1331 1312

	
1332 1313
    /// \name Named template parameters
1333 1314

	
1334 1315
    ///@{
1335 1316
    template <class T>
1336 1317
    struct SetReachedMapTraits : public Traits {
1337 1318
      typedef T ReachedMap;
1338 1319
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1339
        throw UninitializedParameter();
1320
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1321
        return 0; // ignore warnings
1340 1322
      }
1341 1323
    };
1342 1324
    /// \brief \ref named-templ-param "Named parameter" for setting
1343 1325
    /// ReachedMap type.
1344 1326
    ///
1345 1327
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1346 1328
    template <class T>
1347 1329
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1348 1330
                                            SetReachedMapTraits<T> > {
1349 1331
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1350 1332
    };
1351 1333
    ///@}
1352 1334

	
1353 1335
  public:
1354 1336

	
1355 1337
    /// \brief Constructor.
1356 1338
    ///
1357 1339
    /// Constructor.
1358 1340
    ///
1359 1341
    /// \param digraph The digraph the algorithm runs on.
1360 1342
    /// \param visitor The visitor object of the algorithm.
1361 1343
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1362 1344
      : _digraph(&digraph), _visitor(&visitor),
1363 1345
        _reached(0), local_reached(false) {}
1364 1346

	
1365 1347
    /// \brief Destructor.
1366 1348
    ~DfsVisit() {
1367 1349
      if(local_reached) delete _reached;
1368 1350
    }
1369 1351

	
1370 1352
    /// \brief Sets the map that indicates which nodes are reached.
1371 1353
    ///
1372 1354
    /// Sets the map that indicates which nodes are reached.
1373 1355
    /// If you don't use this function before calling \ref run(),
1374 1356
    /// it will allocate one. The destructor deallocates this
1375 1357
    /// automatically allocated map, of course.
1376 1358
    /// \return <tt> (*this) </tt>
1377 1359
    DfsVisit &reachedMap(ReachedMap &m) {
1378 1360
      if(local_reached) {
1379 1361
        delete _reached;
1380 1362
        local_reached=false;
1381 1363
      }
1382 1364
      _reached = &m;
1383 1365
      return *this;
1384 1366
    }
1385 1367

	
1386 1368
  public:
1387 1369

	
1388 1370
    /// \name Execution control
1389 1371
    /// The simplest way to execute the algorithm is to use
1390 1372
    /// one of the member functions called \ref lemon::DfsVisit::run()
1391 1373
    /// "run()".
1392 1374
    /// \n
1393 1375
    /// If you need more control on the execution, first you must call
1394 1376
    /// \ref lemon::DfsVisit::init() "init()", then you can add several
1395 1377
    /// source nodes with \ref lemon::DfsVisit::addSource() "addSource()".
1396 1378
    /// Finally \ref lemon::DfsVisit::start() "start()" will perform the
1397 1379
    /// actual path computation.
1398 1380

	
1399 1381
    /// @{
1400 1382

	
1401 1383
    /// \brief Initializes the internal data structures.
1402 1384
    ///
1403 1385
    /// Initializes the internal data structures.
1404 1386
    void init() {
1405 1387
      create_maps();
1406 1388
      _stack.resize(countNodes(*_digraph));
1407 1389
      _stack_head = -1;
1408 1390
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1409 1391
        _reached->set(u, false);
1410 1392
      }
1411 1393
    }
1412 1394

	
1413 1395
    ///Adds a new source node.
1414 1396

	
1415 1397
    ///Adds a new source node to the set of nodes to be processed.
1416 1398
    ///
1417 1399
    ///\pre The stack must be empty. (Otherwise the algorithm gives
1418 1400
    ///false results.)
1419 1401
    ///
1420 1402
    ///\warning Distances will be wrong (or at least strange) in case of
1421 1403
    ///multiple sources.
1422 1404
    void addSource(Node s)
1423 1405
    {
1424 1406
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1425 1407
      if(!(*_reached)[s]) {
1426 1408
          _reached->set(s,true);
1427 1409
          _visitor->start(s);
1428 1410
          _visitor->reach(s);
1429 1411
          Arc e;
1430 1412
          _digraph->firstOut(e, s);
1431 1413
          if (e != INVALID) {
1432 1414
            _stack[++_stack_head] = e;
1433 1415
          } else {
1434 1416
            _visitor->leave(s);
1435 1417
          }
1436 1418
        }
1437 1419
    }
1438 1420

	
1439 1421
    /// \brief Processes the next arc.
1440 1422
    ///
1441 1423
    /// Processes the next arc.
1442 1424
    ///
1443 1425
    /// \return The processed arc.
1444 1426
    ///
1445 1427
    /// \pre The stack must not be empty.
1446 1428
    Arc processNextArc() {
1447 1429
      Arc e = _stack[_stack_head];
1448 1430
      Node m = _digraph->target(e);
1449 1431
      if(!(*_reached)[m]) {
1450 1432
        _visitor->discover(e);
1451 1433
        _visitor->reach(m);
1452 1434
        _reached->set(m, true);
1453 1435
        _digraph->firstOut(_stack[++_stack_head], m);
1454 1436
      } else {
1455 1437
        _visitor->examine(e);
1456 1438
        m = _digraph->source(e);
1457 1439
        _digraph->nextOut(_stack[_stack_head]);
1458 1440
      }
1459 1441
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1460 1442
        _visitor->leave(m);
1461 1443
        --_stack_head;
1462 1444
        if (_stack_head >= 0) {
1463 1445
          _visitor->backtrack(_stack[_stack_head]);
1464 1446
          m = _digraph->source(_stack[_stack_head]);
1465 1447
          _digraph->nextOut(_stack[_stack_head]);
1466 1448
        } else {
1467 1449
          _visitor->stop(m);
1468 1450
        }
1469 1451
      }
1470 1452
      return e;
1471 1453
    }
1472 1454

	
1473 1455
    /// \brief Next arc to be processed.
1474 1456
    ///
1475 1457
    /// Next arc to be processed.
1476 1458
    ///
1477 1459
    /// \return The next arc to be processed or INVALID if the stack is
1478 1460
    /// empty.
1479 1461
    Arc nextArc() const {
1480 1462
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1481 1463
    }
1482 1464

	
1483 1465
    /// \brief Returns \c false if there are nodes
1484 1466
    /// to be processed.
1485 1467
    ///
1486 1468
    /// Returns \c false if there are nodes
1487 1469
    /// to be processed in the queue (stack).
1488 1470
    bool emptyQueue() const { return _stack_head < 0; }
1489 1471

	
1490 1472
    /// \brief Returns the number of the nodes to be processed.
1491 1473
    ///
1492 1474
    /// Returns the number of the nodes to be processed in the queue (stack).
1493 1475
    int queueSize() const { return _stack_head + 1; }
1494 1476

	
1495 1477
    /// \brief Executes the algorithm.
1496 1478
    ///
1497 1479
    /// Executes the algorithm.
1498 1480
    ///
1499 1481
    /// This method runs the %DFS algorithm from the root node
1500 1482
    /// in order to compute the %DFS path to each node.
1501 1483
    ///
1502 1484
    /// The algorithm computes
1503 1485
    /// - the %DFS tree,
1504 1486
    /// - the distance of each node from the root in the %DFS tree.
1505 1487
    ///
1506 1488
    /// \pre init() must be called and a root node should be
1507 1489
    /// added with addSource() before using this function.
1508 1490
    ///
1509 1491
    /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1510 1492
    /// \code
1511 1493
    ///   while ( !d.emptyQueue() ) {
1512 1494
    ///     d.processNextArc();
1513 1495
    ///   }
1514 1496
    /// \endcode
1515 1497
    void start() {
1516 1498
      while ( !emptyQueue() ) processNextArc();
1517 1499
    }
1518 1500

	
1519 1501
    /// \brief Executes the algorithm until the given target node is reached.
1520 1502
    ///
1521 1503
    /// Executes the algorithm until the given target node is reached.
1522 1504
    ///
1523 1505
    /// This method runs the %DFS algorithm from the root node
1524 1506
    /// in order to compute the DFS path to \c t.
1525 1507
    ///
1526 1508
    /// The algorithm computes
1527 1509
    /// - the %DFS path to \c t,
1528 1510
    /// - the distance of \c t from the root in the %DFS tree.
1529 1511
    ///
1530 1512
    /// \pre init() must be called and a root node should be added
1531 1513
    /// with addSource() before using this function.
1532 1514
    void start(Node t) {
1533 1515
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1534 1516
        processNextArc();
1535 1517
    }
1536 1518

	
1537 1519
    /// \brief Executes the algorithm until a condition is met.
1538 1520
    ///
1539 1521
    /// Executes the algorithm until a condition is met.
1540 1522
    ///
1541 1523
    /// This method runs the %DFS algorithm from the root node
1542 1524
    /// until an arc \c a with <tt>am[a]</tt> true is found.
1543 1525
    ///
1544 1526
    /// \param am A \c bool (or convertible) arc map. The algorithm
1545 1527
    /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1546 1528
    ///
1547 1529
    /// \return The reached arc \c a with <tt>am[a]</tt> true or
1548 1530
    /// \c INVALID if no such arc was found.
1549 1531
    ///
1550 1532
    /// \pre init() must be called and a root node should be added
1551 1533
    /// with addSource() before using this function.
1552 1534
    ///
1553 1535
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1554 1536
    /// not a node map.
1555 1537
    template <typename AM>
1556 1538
    Arc start(const AM &am) {
1557 1539
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
1558 1540
        processNextArc();
1559 1541
      return emptyQueue() ? INVALID : _stack[_stack_head];
1560 1542
    }
1561 1543

	
1562 1544
    /// \brief Runs the algorithm from the given source node.
1563 1545
    ///
1564 1546
    /// This method runs the %DFS algorithm from node \c s.
1565 1547
    /// in order to compute the DFS path to each node.
1566 1548
    ///
1567 1549
    /// The algorithm computes
1568 1550
    /// - the %DFS tree,
1569 1551
    /// - the distance of each node from the root in the %DFS tree.
1570 1552
    ///
1571 1553
    /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1572 1554
    ///\code
1573 1555
    ///   d.init();
1574 1556
    ///   d.addSource(s);
1575 1557
    ///   d.start();
1576 1558
    ///\endcode
1577 1559
    void run(Node s) {
1578 1560
      init();
1579 1561
      addSource(s);
1580 1562
      start();
1581 1563
    }
1582 1564

	
1583 1565
    /// \brief Finds the %DFS path between \c s and \c t.
1584 1566

	
1585 1567
    /// This method runs the %DFS algorithm from node \c s
1586 1568
    /// in order to compute the DFS path to node \c t
1587 1569
    /// (it stops searching when \c t is processed).
1588 1570
    ///
1589 1571
    /// \return \c true if \c t is reachable form \c s.
1590 1572
    ///
1591 1573
    /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1592 1574
    /// just a shortcut of the following code.
1593 1575
    ///\code
1594 1576
    ///   d.init();
1595 1577
    ///   d.addSource(s);
1596 1578
    ///   d.start(t);
1597 1579
    ///\endcode
1598 1580
    bool run(Node s,Node t) {
1599 1581
      init();
1600 1582
      addSource(s);
1601 1583
      start(t);
1602 1584
      return reached(t);
1603 1585
    }
1604 1586

	
1605 1587
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1606 1588

	
1607 1589
    /// This method runs the %DFS algorithm in order to
1608 1590
    /// compute the %DFS path to each node.
1609 1591
    ///
1610 1592
    /// The algorithm computes
1611 1593
    /// - the %DFS tree,
1612 1594
    /// - the distance of each node from the root in the %DFS tree.
1613 1595
    ///
1614 1596
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1615 1597
    ///\code
1616 1598
    ///   d.init();
1617 1599
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1618 1600
    ///     if (!d.reached(n)) {
1619 1601
    ///       d.addSource(n);
1620 1602
    ///       d.start();
1621 1603
    ///     }
1622 1604
    ///   }
1623 1605
    ///\endcode
1624 1606
    void run() {
1625 1607
      init();
1626 1608
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1627 1609
        if (!reached(it)) {
1628 1610
          addSource(it);
1629 1611
          start();
1630 1612
        }
1631 1613
      }
1632 1614
    }
1633 1615

	
1634 1616
    ///@}
1635 1617

	
1636 1618
    /// \name Query Functions
1637 1619
    /// The result of the %DFS algorithm can be obtained using these
1638 1620
    /// functions.\n
1639 1621
    /// Either \ref lemon::DfsVisit::run() "run()" or
1640 1622
    /// \ref lemon::DfsVisit::start() "start()" must be called before
1641 1623
    /// using them.
1642 1624
    ///@{
1643 1625

	
1644 1626
    /// \brief Checks if a node is reachable from the root(s).
1645 1627
    ///
1646 1628
    /// Returns \c true if \c v is reachable from the root(s).
1647 1629
    /// \pre Either \ref run() or \ref start()
1648 1630
    /// must be called before using this function.
1649 1631
    bool reached(Node v) { return (*_reached)[v]; }
1650 1632

	
1651 1633
    ///@}
1652 1634

	
1653 1635
  };
1654 1636

	
1655 1637
} //END OF NAMESPACE LEMON
1656 1638

	
1657 1639
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
25 25

	
26 26
#include <limits>
27 27
#include <lemon/list_graph.h>
28 28
#include <lemon/bin_heap.h>
29 29
#include <lemon/bits/path_dump.h>
30 30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default operation traits for the Dijkstra algorithm class.
38 38
  ///
39 39
  /// This operation traits class defines all computational operations and
40 40
  /// constants which are used in the Dijkstra algorithm.
41 41
  template <typename Value>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \brief Gives back the zero value of the type.
44 44
    static Value zero() {
45 45
      return static_cast<Value>(0);
46 46
    }
47 47
    /// \brief Gives back the sum of the given two elements.
48 48
    static Value plus(const Value& left, const Value& right) {
49 49
      return left + right;
50 50
    }
51 51
    /// \brief Gives back true only if the first value is less than the second.
52 52
    static bool less(const Value& left, const Value& right) {
53 53
      return left < right;
54 54
    }
55 55
  };
56 56

	
57 57
  /// \brief Widest path operation traits for the Dijkstra algorithm class.
58 58
  ///
59 59
  /// This operation traits class defines all computational operations and
60 60
  /// constants which are used in the Dijkstra algorithm for widest path
61 61
  /// computation.
62 62
  ///
63 63
  /// \see DijkstraDefaultOperationTraits
64 64
  template <typename Value>
65 65
  struct DijkstraWidestPathOperationTraits {
66 66
    /// \brief Gives back the maximum value of the type.
67 67
    static Value zero() {
68 68
      return std::numeric_limits<Value>::max();
69 69
    }
70 70
    /// \brief Gives back the minimum of the given two elements.
71 71
    static Value plus(const Value& left, const Value& right) {
72 72
      return std::min(left, right);
73 73
    }
74 74
    /// \brief Gives back true only if the first value is less than the second.
75 75
    static bool less(const Value& left, const Value& right) {
76 76
      return left < right;
77 77
    }
78 78
  };
79 79

	
80 80
  ///Default traits class of Dijkstra class.
81 81

	
82 82
  ///Default traits class of Dijkstra class.
83 83
  ///\tparam GR The type of the digraph.
84 84
  ///\tparam LM The type of the length map.
85 85
  template<class GR, class LM>
86 86
  struct DijkstraDefaultTraits
87 87
  {
88 88
    ///The type of the digraph the algorithm runs on.
89 89
    typedef GR Digraph;
90 90

	
91 91
    ///The type of the map that stores the arc lengths.
92 92

	
93 93
    ///The type of the map that stores the arc lengths.
94 94
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
95 95
    typedef LM LengthMap;
96 96
    ///The type of the length of the arcs.
97 97
    typedef typename LM::Value Value;
98 98

	
99 99
    /// Operation traits for Dijkstra algorithm.
100 100

	
101 101
    /// This class defines the operations that are used in the algorithm.
102 102
    /// \see DijkstraDefaultOperationTraits
103 103
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
104 104

	
105 105
    /// The cross reference type used by the heap.
106 106

	
107 107
    /// The cross reference type used by the heap.
108 108
    /// Usually it is \c Digraph::NodeMap<int>.
109 109
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
110 110
    ///Instantiates a \ref HeapCrossRef.
111 111

	
112 112
    ///This function instantiates a \ref HeapCrossRef.
113 113
    /// \param g is the digraph, to which we would like to define the
114 114
    /// \ref HeapCrossRef.
115 115
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
116 116
    {
117 117
      return new HeapCrossRef(g);
118 118
    }
119 119

	
120 120
    ///The heap type used by the Dijkstra algorithm.
121 121

	
122 122
    ///The heap type used by the Dijkstra algorithm.
123 123
    ///
124 124
    ///\sa BinHeap
125 125
    ///\sa Dijkstra
126 126
    typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
127 127
    ///Instantiates a \ref Heap.
128 128

	
129 129
    ///This function instantiates a \ref Heap.
130 130
    static Heap *createHeap(HeapCrossRef& r)
131 131
    {
132 132
      return new Heap(r);
133 133
    }
134 134

	
135 135
    ///\brief The type of the map that stores the predecessor
136 136
    ///arcs of the shortest paths.
137 137
    ///
138 138
    ///The type of the map that stores the predecessor
139 139
    ///arcs of the shortest paths.
140 140
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
141 141
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
142 142
    ///Instantiates a \ref PredMap.
143 143

	
144 144
    ///This function instantiates a \ref PredMap.
145 145
    ///\param g is the digraph, to which we would like to define the
146 146
    ///\ref PredMap.
147 147
    static PredMap *createPredMap(const Digraph &g)
148 148
    {
149 149
      return new PredMap(g);
150 150
    }
151 151

	
152 152
    ///The type of the map that indicates which nodes are processed.
153 153

	
154 154
    ///The type of the map that indicates which nodes are processed.
155 155
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
156 156
    ///By default it is a NullMap.
157 157
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
158 158
    ///Instantiates a \ref ProcessedMap.
159 159

	
160 160
    ///This function instantiates a \ref ProcessedMap.
161 161
    ///\param g is the digraph, to which
162 162
    ///we would like to define the \ref ProcessedMap
163 163
#ifdef DOXYGEN
164 164
    static ProcessedMap *createProcessedMap(const Digraph &g)
165 165
#else
166 166
    static ProcessedMap *createProcessedMap(const Digraph &)
167 167
#endif
168 168
    {
169 169
      return new ProcessedMap();
170 170
    }
171 171

	
172 172
    ///The type of the map that stores the distances of the nodes.
173 173

	
174 174
    ///The type of the map that stores the distances of the nodes.
175 175
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
176 176
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
177 177
    ///Instantiates a \ref DistMap.
178 178

	
179 179
    ///This function instantiates a \ref DistMap.
180 180
    ///\param g is the digraph, to which we would like to define
181 181
    ///the \ref DistMap
182 182
    static DistMap *createDistMap(const Digraph &g)
183 183
    {
184 184
      return new DistMap(g);
185 185
    }
186 186
  };
187 187

	
188 188
  ///%Dijkstra algorithm class.
189 189

	
190 190
  /// \ingroup shortest_path
191 191
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
192 192
  ///
193 193
  ///The arc lengths are passed to the algorithm using a
194 194
  ///\ref concepts::ReadMap "ReadMap",
195 195
  ///so it is easy to change it to any kind of length.
196 196
  ///The type of the length is determined by the
197 197
  ///\ref concepts::ReadMap::Value "Value" of the length map.
198 198
  ///It is also possible to change the underlying priority heap.
199 199
  ///
200 200
  ///There is also a \ref dijkstra() "function-type interface" for the
201 201
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
202 202
  ///it can be used easier.
203 203
  ///
204 204
  ///\tparam GR The type of the digraph the algorithm runs on.
205 205
  ///The default value is \ref ListDigraph.
206 206
  ///The value of GR is not used directly by \ref Dijkstra, it is only
207 207
  ///passed to \ref DijkstraDefaultTraits.
208 208
  ///\tparam LM A readable arc map that determines the lengths of the
209 209
  ///arcs. It is read once for each arc, so the map may involve in
210 210
  ///relatively time consuming process to compute the arc lengths if
211 211
  ///it is necessary. The default map type is \ref
212 212
  ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
213 213
  ///The value of LM is not used directly by \ref Dijkstra, it is only
214 214
  ///passed to \ref DijkstraDefaultTraits.
215 215
  ///\tparam TR Traits class to set various data types used by the algorithm.
216 216
  ///The default traits class is \ref DijkstraDefaultTraits
217 217
  ///"DijkstraDefaultTraits<GR,LM>". See \ref DijkstraDefaultTraits
218 218
  ///for the documentation of a Dijkstra traits class.
219 219
#ifdef DOXYGEN
220 220
  template <typename GR, typename LM, typename TR>
221 221
#else
222 222
  template <typename GR=ListDigraph,
223 223
            typename LM=typename GR::template ArcMap<int>,
224 224
            typename TR=DijkstraDefaultTraits<GR,LM> >
225 225
#endif
226 226
  class Dijkstra {
227 227
  public:
228
    ///\ref Exception for uninitialized parameters.
229

	
230
    ///This error represents problems in the initialization of the
231
    ///parameters of the algorithm.
232
    class UninitializedParameter : public lemon::UninitializedParameter {
233
    public:
234
      virtual const char* what() const throw() {
235
        return "lemon::Dijkstra::UninitializedParameter";
236
      }
237
    };
238 228

	
239 229
    ///The type of the digraph the algorithm runs on.
240 230
    typedef typename TR::Digraph Digraph;
241 231

	
242 232
    ///The type of the length of the arcs.
243 233
    typedef typename TR::LengthMap::Value Value;
244 234
    ///The type of the map that stores the arc lengths.
245 235
    typedef typename TR::LengthMap LengthMap;
246 236
    ///\brief The type of the map that stores the predecessor arcs of the
247 237
    ///shortest paths.
248 238
    typedef typename TR::PredMap PredMap;
249 239
    ///The type of the map that stores the distances of the nodes.
250 240
    typedef typename TR::DistMap DistMap;
251 241
    ///The type of the map that indicates which nodes are processed.
252 242
    typedef typename TR::ProcessedMap ProcessedMap;
253 243
    ///The type of the paths.
254 244
    typedef PredMapPath<Digraph, PredMap> Path;
255 245
    ///The cross reference type used for the current heap.
256 246
    typedef typename TR::HeapCrossRef HeapCrossRef;
257 247
    ///The heap type used by the algorithm.
258 248
    typedef typename TR::Heap Heap;
259 249
    ///The operation traits class.
260 250
    typedef typename TR::OperationTraits OperationTraits;
261 251

	
262 252
    ///The traits class.
263 253
    typedef TR Traits;
264 254

	
265 255
  private:
266 256

	
267 257
    typedef typename Digraph::Node Node;
268 258
    typedef typename Digraph::NodeIt NodeIt;
269 259
    typedef typename Digraph::Arc Arc;
270 260
    typedef typename Digraph::OutArcIt OutArcIt;
271 261

	
272 262
    //Pointer to the underlying digraph.
273 263
    const Digraph *G;
274 264
    //Pointer to the length map.
275 265
    const LengthMap *length;
276 266
    //Pointer to the map of predecessors arcs.
277 267
    PredMap *_pred;
278 268
    //Indicates if _pred is locally allocated (true) or not.
279 269
    bool local_pred;
280 270
    //Pointer to the map of distances.
281 271
    DistMap *_dist;
282 272
    //Indicates if _dist is locally allocated (true) or not.
283 273
    bool local_dist;
284 274
    //Pointer to the map of processed status of the nodes.
285 275
    ProcessedMap *_processed;
286 276
    //Indicates if _processed is locally allocated (true) or not.
287 277
    bool local_processed;
288 278
    //Pointer to the heap cross references.
289 279
    HeapCrossRef *_heap_cross_ref;
290 280
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
291 281
    bool local_heap_cross_ref;
292 282
    //Pointer to the heap.
293 283
    Heap *_heap;
294 284
    //Indicates if _heap is locally allocated (true) or not.
295 285
    bool local_heap;
296 286

	
297 287
    //Creates the maps if necessary.
298 288
    void create_maps()
299 289
    {
300 290
      if(!_pred) {
301 291
        local_pred = true;
302 292
        _pred = Traits::createPredMap(*G);
303 293
      }
304 294
      if(!_dist) {
305 295
        local_dist = true;
306 296
        _dist = Traits::createDistMap(*G);
307 297
      }
308 298
      if(!_processed) {
309 299
        local_processed = true;
310 300
        _processed = Traits::createProcessedMap(*G);
311 301
      }
312 302
      if (!_heap_cross_ref) {
313 303
        local_heap_cross_ref = true;
314 304
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
315 305
      }
316 306
      if (!_heap) {
317 307
        local_heap = true;
318 308
        _heap = Traits::createHeap(*_heap_cross_ref);
319 309
      }
320 310
    }
321 311

	
322 312
  public:
323 313

	
324 314
    typedef Dijkstra Create;
325 315

	
326 316
    ///\name Named template parameters
327 317

	
328 318
    ///@{
329 319

	
330 320
    template <class T>
331 321
    struct SetPredMapTraits : public Traits {
332 322
      typedef T PredMap;
333 323
      static PredMap *createPredMap(const Digraph &)
334 324
      {
335
        throw UninitializedParameter();
325
        LEMON_ASSERT(false, "PredMap is not initialized");
326
        return 0; // ignore warnings
336 327
      }
337 328
    };
338 329
    ///\brief \ref named-templ-param "Named parameter" for setting
339 330
    ///\ref PredMap type.
340 331
    ///
341 332
    ///\ref named-templ-param "Named parameter" for setting
342 333
    ///\ref PredMap type.
343 334
    template <class T>
344 335
    struct SetPredMap
345 336
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
346 337
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
347 338
    };
348 339

	
349 340
    template <class T>
350 341
    struct SetDistMapTraits : public Traits {
351 342
      typedef T DistMap;
352 343
      static DistMap *createDistMap(const Digraph &)
353 344
      {
354
        throw UninitializedParameter();
345
        LEMON_ASSERT(false, "DistMap is not initialized");
346
        return 0; // ignore warnings
355 347
      }
356 348
    };
357 349
    ///\brief \ref named-templ-param "Named parameter" for setting
358 350
    ///\ref DistMap type.
359 351
    ///
360 352
    ///\ref named-templ-param "Named parameter" for setting
361 353
    ///\ref DistMap type.
362 354
    template <class T>
363 355
    struct SetDistMap
364 356
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
365 357
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
366 358
    };
367 359

	
368 360
    template <class T>
369 361
    struct SetProcessedMapTraits : public Traits {
370 362
      typedef T ProcessedMap;
371 363
      static ProcessedMap *createProcessedMap(const Digraph &)
372 364
      {
373
        throw UninitializedParameter();
365
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
366
        return 0; // ignore warnings
374 367
      }
375 368
    };
376 369
    ///\brief \ref named-templ-param "Named parameter" for setting
377 370
    ///\ref ProcessedMap type.
378 371
    ///
379 372
    ///\ref named-templ-param "Named parameter" for setting
380 373
    ///\ref ProcessedMap type.
381 374
    template <class T>
382 375
    struct SetProcessedMap
383 376
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
384 377
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
385 378
    };
386 379

	
387 380
    struct SetStandardProcessedMapTraits : public Traits {
388 381
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
389 382
      static ProcessedMap *createProcessedMap(const Digraph &g)
390 383
      {
391 384
        return new ProcessedMap(g);
392 385
      }
393 386
    };
394 387
    ///\brief \ref named-templ-param "Named parameter" for setting
395 388
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
396 389
    ///
397 390
    ///\ref named-templ-param "Named parameter" for setting
398 391
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
399 392
    ///If you don't set it explicitly, it will be automatically allocated.
400 393
    struct SetStandardProcessedMap
401 394
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
402 395
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
403 396
      Create;
404 397
    };
405 398

	
406 399
    template <class H, class CR>
407 400
    struct SetHeapTraits : public Traits {
408 401
      typedef CR HeapCrossRef;
409 402
      typedef H Heap;
410 403
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
411
        throw UninitializedParameter();
404
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
405
        return 0; // ignore warnings
412 406
      }
413 407
      static Heap *createHeap(HeapCrossRef &)
414 408
      {
415
        throw UninitializedParameter();
409
        LEMON_ASSERT(false, "Heap is not initialized");
410
        return 0; // ignore warnings
416 411
      }
417 412
    };
418 413
    ///\brief \ref named-templ-param "Named parameter" for setting
419 414
    ///heap and cross reference type
420 415
    ///
421 416
    ///\ref named-templ-param "Named parameter" for setting heap and cross
422 417
    ///reference type.
423 418
    template <class H, class CR = typename Digraph::template NodeMap<int> >
424 419
    struct SetHeap
425 420
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
426 421
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
427 422
    };
428 423

	
429 424
    template <class H, class CR>
430 425
    struct SetStandardHeapTraits : public Traits {
431 426
      typedef CR HeapCrossRef;
432 427
      typedef H Heap;
433 428
      static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
434 429
        return new HeapCrossRef(G);
435 430
      }
436 431
      static Heap *createHeap(HeapCrossRef &R)
437 432
      {
438 433
        return new Heap(R);
439 434
      }
440 435
    };
441 436
    ///\brief \ref named-templ-param "Named parameter" for setting
442 437
    ///heap and cross reference type with automatic allocation
443 438
    ///
444 439
    ///\ref named-templ-param "Named parameter" for setting heap and cross
445 440
    ///reference type. It can allocate the heap and the cross reference
446 441
    ///object if the cross reference's constructor waits for the digraph as
447 442
    ///parameter and the heap's constructor waits for the cross reference.
448 443
    template <class H, class CR = typename Digraph::template NodeMap<int> >
449 444
    struct SetStandardHeap
450 445
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
451 446
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
452 447
      Create;
453 448
    };
454 449

	
455 450
    template <class T>
456 451
    struct SetOperationTraitsTraits : public Traits {
457 452
      typedef T OperationTraits;
458 453
    };
459 454

	
460 455
    /// \brief \ref named-templ-param "Named parameter" for setting
461 456
    ///\ref OperationTraits type
462 457
    ///
463 458
    ///\ref named-templ-param "Named parameter" for setting
464 459
    ///\ref OperationTraits type.
465 460
    template <class T>
466 461
    struct SetOperationTraits
467 462
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
468 463
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
469 464
      Create;
470 465
    };
471 466

	
472 467
    ///@}
473 468

	
474 469
  protected:
475 470

	
476 471
    Dijkstra() {}
477 472

	
478 473
  public:
479 474

	
480 475
    ///Constructor.
481 476

	
482 477
    ///Constructor.
483 478
    ///\param _g The digraph the algorithm runs on.
484 479
    ///\param _length The length map used by the algorithm.
485 480
    Dijkstra(const Digraph& _g, const LengthMap& _length) :
486 481
      G(&_g), length(&_length),
487 482
      _pred(NULL), local_pred(false),
488 483
      _dist(NULL), local_dist(false),
489 484
      _processed(NULL), local_processed(false),
490 485
      _heap_cross_ref(NULL), local_heap_cross_ref(false),
491 486
      _heap(NULL), local_heap(false)
492 487
    { }
493 488

	
494 489
    ///Destructor.
495 490
    ~Dijkstra()
496 491
    {
497 492
      if(local_pred) delete _pred;
498 493
      if(local_dist) delete _dist;
499 494
      if(local_processed) delete _processed;
500 495
      if(local_heap_cross_ref) delete _heap_cross_ref;
501 496
      if(local_heap) delete _heap;
502 497
    }
503 498

	
504 499
    ///Sets the length map.
505 500

	
506 501
    ///Sets the length map.
507 502
    ///\return <tt> (*this) </tt>
508 503
    Dijkstra &lengthMap(const LengthMap &m)
509 504
    {
510 505
      length = &m;
511 506
      return *this;
512 507
    }
513 508

	
514 509
    ///Sets the map that stores the predecessor arcs.
515 510

	
516 511
    ///Sets the map that stores the predecessor arcs.
517 512
    ///If you don't use this function before calling \ref run(),
518 513
    ///it will allocate one. The destructor deallocates this
519 514
    ///automatically allocated map, of course.
520 515
    ///\return <tt> (*this) </tt>
521 516
    Dijkstra &predMap(PredMap &m)
522 517
    {
523 518
      if(local_pred) {
524 519
        delete _pred;
525 520
        local_pred=false;
526 521
      }
527 522
      _pred = &m;
528 523
      return *this;
529 524
    }
530 525

	
531 526
    ///Sets the map that indicates which nodes are processed.
532 527

	
533 528
    ///Sets the map that indicates which nodes are processed.
534 529
    ///If you don't use this function before calling \ref run(),
535 530
    ///it will allocate one. The destructor deallocates this
536 531
    ///automatically allocated map, of course.
537 532
    ///\return <tt> (*this) </tt>
538 533
    Dijkstra &processedMap(ProcessedMap &m)
539 534
    {
540 535
      if(local_processed) {
541 536
        delete _processed;
542 537
        local_processed=false;
543 538
      }
544 539
      _processed = &m;
545 540
      return *this;
546 541
    }
547 542

	
548 543
    ///Sets the map that stores the distances of the nodes.
549 544

	
550 545
    ///Sets the map that stores the distances of the nodes calculated by the
551 546
    ///algorithm.
552 547
    ///If you don't use this function before calling \ref run(),
553 548
    ///it will allocate one. The destructor deallocates this
554 549
    ///automatically allocated map, of course.
555 550
    ///\return <tt> (*this) </tt>
556 551
    Dijkstra &distMap(DistMap &m)
557 552
    {
558 553
      if(local_dist) {
559 554
        delete _dist;
560 555
        local_dist=false;
561 556
      }
562 557
      _dist = &m;
563 558
      return *this;
564 559
    }
565 560

	
566 561
    ///Sets the heap and the cross reference used by algorithm.
567 562

	
568 563
    ///Sets the heap and the cross reference used by algorithm.
569 564
    ///If you don't use this function before calling \ref run(),
570 565
    ///it will allocate one. The destructor deallocates this
571 566
    ///automatically allocated heap and cross reference, of course.
572 567
    ///\return <tt> (*this) </tt>
573 568
    Dijkstra &heap(Heap& hp, HeapCrossRef &cr)
574 569
    {
575 570
      if(local_heap_cross_ref) {
576 571
        delete _heap_cross_ref;
577 572
        local_heap_cross_ref=false;
578 573
      }
579 574
      _heap_cross_ref = &cr;
580 575
      if(local_heap) {
581 576
        delete _heap;
582 577
        local_heap=false;
583 578
      }
584 579
      _heap = &hp;
585 580
      return *this;
586 581
    }
587 582

	
588 583
  private:
589 584

	
590 585
    void finalizeNodeData(Node v,Value dst)
591 586
    {
592 587
      _processed->set(v,true);
593 588
      _dist->set(v, dst);
594 589
    }
595 590

	
596 591
  public:
597 592

	
598 593
    ///\name Execution control
599 594
    ///The simplest way to execute the algorithm is to use one of the
600 595
    ///member functions called \ref lemon::Dijkstra::run() "run()".
601 596
    ///\n
602 597
    ///If you need more control on the execution, first you must call
603 598
    ///\ref lemon::Dijkstra::init() "init()", then you can add several
604 599
    ///source nodes with \ref lemon::Dijkstra::addSource() "addSource()".
605 600
    ///Finally \ref lemon::Dijkstra::start() "start()" will perform the
606 601
    ///actual path computation.
607 602

	
608 603
    ///@{
609 604

	
610 605
    ///Initializes the internal data structures.
611 606

	
612 607
    ///Initializes the internal data structures.
613 608
    ///
614 609
    void init()
615 610
    {
616 611
      create_maps();
617 612
      _heap->clear();
618 613
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
619 614
        _pred->set(u,INVALID);
620 615
        _processed->set(u,false);
621 616
        _heap_cross_ref->set(u,Heap::PRE_HEAP);
622 617
      }
623 618
    }
624 619

	
625 620
    ///Adds a new source node.
626 621

	
627 622
    ///Adds a new source node to the priority heap.
628 623
    ///The optional second parameter is the initial distance of the node.
629 624
    ///
630 625
    ///The function checks if the node has already been added to the heap and
631 626
    ///it is pushed to the heap only if either it was not in the heap
632 627
    ///or the shortest path found till then is shorter than \c dst.
633 628
    void addSource(Node s,Value dst=OperationTraits::zero())
634 629
    {
635 630
      if(_heap->state(s) != Heap::IN_HEAP) {
636 631
        _heap->push(s,dst);
637 632
      } else if(OperationTraits::less((*_heap)[s], dst)) {
638 633
        _heap->set(s,dst);
639 634
        _pred->set(s,INVALID);
640 635
      }
641 636
    }
642 637

	
643 638
    ///Processes the next node in the priority heap
644 639

	
645 640
    ///Processes the next node in the priority heap.
646 641
    ///
647 642
    ///\return The processed node.
648 643
    ///
649 644
    ///\warning The priority heap must not be empty.
650 645
    Node processNextNode()
651 646
    {
652 647
      Node v=_heap->top();
653 648
      Value oldvalue=_heap->prio();
654 649
      _heap->pop();
655 650
      finalizeNodeData(v,oldvalue);
656 651

	
657 652
      for(OutArcIt e(*G,v); e!=INVALID; ++e) {
658 653
        Node w=G->target(e);
659 654
        switch(_heap->state(w)) {
660 655
        case Heap::PRE_HEAP:
661 656
          _heap->push(w,OperationTraits::plus(oldvalue, (*length)[e]));
662 657
          _pred->set(w,e);
663 658
          break;
664 659
        case Heap::IN_HEAP:
665 660
          {
666 661
            Value newvalue = OperationTraits::plus(oldvalue, (*length)[e]);
667 662
            if ( OperationTraits::less(newvalue, (*_heap)[w]) ) {
668 663
              _heap->decrease(w, newvalue);
669 664
              _pred->set(w,e);
670 665
            }
671 666
          }
672 667
          break;
673 668
        case Heap::POST_HEAP:
674 669
          break;
675 670
        }
676 671
      }
677 672
      return v;
678 673
    }
679 674

	
680 675
    ///The next node to be processed.
681 676

	
682 677
    ///Returns the next node to be processed or \c INVALID if the
683 678
    ///priority heap is empty.
684 679
    Node nextNode() const
685 680
    {
686 681
      return !_heap->empty()?_heap->top():INVALID;
687 682
    }
688 683

	
689 684
    ///\brief Returns \c false if there are nodes
690 685
    ///to be processed.
691 686
    ///
692 687
    ///Returns \c false if there are nodes
693 688
    ///to be processed in the priority heap.
694 689
    bool emptyQueue() const { return _heap->empty(); }
695 690

	
696 691
    ///Returns the number of the nodes to be processed in the priority heap
697 692

	
698 693
    ///Returns the number of the nodes to be processed in the priority heap.
699 694
    ///
700 695
    int queueSize() const { return _heap->size(); }
701 696

	
702 697
    ///Executes the algorithm.
703 698

	
704 699
    ///Executes the algorithm.
705 700
    ///
706 701
    ///This method runs the %Dijkstra algorithm from the root node(s)
707 702
    ///in order to compute the shortest path to each node.
708 703
    ///
709 704
    ///The algorithm computes
710 705
    ///- the shortest path tree (forest),
711 706
    ///- the distance of each node from the root(s).
712 707
    ///
713 708
    ///\pre init() must be called and at least one root node should be
714 709
    ///added with addSource() before using this function.
715 710
    ///
716 711
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
717 712
    ///\code
718 713
    ///  while ( !d.emptyQueue() ) {
719 714
    ///    d.processNextNode();
720 715
    ///  }
721 716
    ///\endcode
722 717
    void start()
723 718
    {
724 719
      while ( !emptyQueue() ) processNextNode();
725 720
    }
726 721

	
727 722
    ///Executes the algorithm until the given target node is processed.
728 723

	
729 724
    ///Executes the algorithm until the given target node is processed.
730 725
    ///
731 726
    ///This method runs the %Dijkstra algorithm from the root node(s)
732 727
    ///in order to compute the shortest path to \c t.
733 728
    ///
734 729
    ///The algorithm computes
735 730
    ///- the shortest path to \c t,
736 731
    ///- the distance of \c t from the root(s).
737 732
    ///
738 733
    ///\pre init() must be called and at least one root node should be
739 734
    ///added with addSource() before using this function.
740 735
    void start(Node t)
741 736
    {
742 737
      while ( !_heap->empty() && _heap->top()!=t ) processNextNode();
743 738
      if ( !_heap->empty() ) {
744 739
        finalizeNodeData(_heap->top(),_heap->prio());
745 740
        _heap->pop();
746 741
      }
747 742
    }
748 743

	
749 744
    ///Executes the algorithm until a condition is met.
750 745

	
751 746
    ///Executes the algorithm until a condition is met.
752 747
    ///
753 748
    ///This method runs the %Dijkstra algorithm from the root node(s) in
754 749
    ///order to compute the shortest path to a node \c v with
755 750
    /// <tt>nm[v]</tt> true, if such a node can be found.
756 751
    ///
757 752
    ///\param nm A \c bool (or convertible) node map. The algorithm
758 753
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
759 754
    ///
760 755
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
761 756
    ///\c INVALID if no such node was found.
762 757
    ///
763 758
    ///\pre init() must be called and at least one root node should be
764 759
    ///added with addSource() before using this function.
765 760
    template<class NodeBoolMap>
766 761
    Node start(const NodeBoolMap &nm)
767 762
    {
768 763
      while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
769 764
      if ( _heap->empty() ) return INVALID;
770 765
      finalizeNodeData(_heap->top(),_heap->prio());
771 766
      return _heap->top();
772 767
    }
773 768

	
774 769
    ///Runs the algorithm from the given source node.
775 770

	
776 771
    ///This method runs the %Dijkstra algorithm from node \c s
777 772
    ///in order to compute the shortest path to each node.
778 773
    ///
779 774
    ///The algorithm computes
780 775
    ///- the shortest path tree,
781 776
    ///- the distance of each node from the root.
782 777
    ///
783 778
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
784 779
    ///\code
785 780
    ///  d.init();
786 781
    ///  d.addSource(s);
787 782
    ///  d.start();
788 783
    ///\endcode
789 784
    void run(Node s) {
790 785
      init();
791 786
      addSource(s);
792 787
      start();
793 788
    }
794 789

	
795 790
    ///Finds the shortest path between \c s and \c t.
796 791

	
797 792
    ///This method runs the %Dijkstra algorithm from node \c s
798 793
    ///in order to compute the shortest path to node \c t
799 794
    ///(it stops searching when \c t is processed).
800 795
    ///
801 796
    ///\return \c true if \c t is reachable form \c s.
802 797
    ///
803 798
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is just a
804 799
    ///shortcut of the following code.
805 800
    ///\code
806 801
    ///  d.init();
807 802
    ///  d.addSource(s);
808 803
    ///  d.start(t);
809 804
    ///\endcode
810 805
    bool run(Node s,Node t) {
811 806
      init();
812 807
      addSource(s);
813 808
      start(t);
814 809
      return (*_heap_cross_ref)[t] == Heap::POST_HEAP;
815 810
    }
816 811

	
817 812
    ///@}
818 813

	
819 814
    ///\name Query Functions
820 815
    ///The result of the %Dijkstra algorithm can be obtained using these
821 816
    ///functions.\n
822 817
    ///Either \ref lemon::Dijkstra::run() "run()" or
823 818
    ///\ref lemon::Dijkstra::start() "start()" must be called before
824 819
    ///using them.
825 820

	
826 821
    ///@{
827 822

	
828 823
    ///The shortest path to a node.
829 824

	
830 825
    ///Returns the shortest path to a node.
831 826
    ///
832 827
    ///\warning \c t should be reachable from the root(s).
833 828
    ///
834 829
    ///\pre Either \ref run() or \ref start() must be called before
835 830
    ///using this function.
836 831
    Path path(Node t) const { return Path(*G, *_pred, t); }
837 832

	
838 833
    ///The distance of a node from the root(s).
839 834

	
840 835
    ///Returns the distance of a node from the root(s).
841 836
    ///
842 837
    ///\warning If node \c v is not reachable from the root(s), then
843 838
    ///the return value of this function is undefined.
844 839
    ///
845 840
    ///\pre Either \ref run() or \ref start() must be called before
846 841
    ///using this function.
847 842
    Value dist(Node v) const { return (*_dist)[v]; }
848 843

	
849 844
    ///Returns the 'previous arc' of the shortest path tree for a node.
850 845

	
851 846
    ///This function returns the 'previous arc' of the shortest path
852 847
    ///tree for the node \c v, i.e. it returns the last arc of a
853 848
    ///shortest path from the root(s) to \c v. It is \c INVALID if \c v
854 849
    ///is not reachable from the root(s) or if \c v is a root.
855 850
    ///
856 851
    ///The shortest path tree used here is equal to the shortest path
857 852
    ///tree used in \ref predNode().
858 853
    ///
859 854
    ///\pre Either \ref run() or \ref start() must be called before
860 855
    ///using this function.
861 856
    Arc predArc(Node v) const { return (*_pred)[v]; }
862 857

	
863 858
    ///Returns the 'previous node' of the shortest path tree for a node.
864 859

	
865 860
    ///This function returns the 'previous node' of the shortest path
866 861
    ///tree for the node \c v, i.e. it returns the last but one node
867 862
    ///from a shortest path from the root(s) to \c v. It is \c INVALID
868 863
    ///if \c v is not reachable from the root(s) or if \c v is a root.
869 864
    ///
870 865
    ///The shortest path tree used here is equal to the shortest path
871 866
    ///tree used in \ref predArc().
872 867
    ///
873 868
    ///\pre Either \ref run() or \ref start() must be called before
874 869
    ///using this function.
875 870
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
876 871
                                  G->source((*_pred)[v]); }
877 872

	
878 873
    ///\brief Returns a const reference to the node map that stores the
879 874
    ///distances of the nodes.
880 875
    ///
881 876
    ///Returns a const reference to the node map that stores the distances
882 877
    ///of the nodes calculated by the algorithm.
883 878
    ///
884 879
    ///\pre Either \ref run() or \ref init()
885 880
    ///must be called before using this function.
886 881
    const DistMap &distMap() const { return *_dist;}
887 882

	
888 883
    ///\brief Returns a const reference to the node map that stores the
889 884
    ///predecessor arcs.
890 885
    ///
891 886
    ///Returns a const reference to the node map that stores the predecessor
892 887
    ///arcs, which form the shortest path tree.
893 888
    ///
894 889
    ///\pre Either \ref run() or \ref init()
895 890
    ///must be called before using this function.
896 891
    const PredMap &predMap() const { return *_pred;}
897 892

	
898 893
    ///Checks if a node is reachable from the root(s).
899 894

	
900 895
    ///Returns \c true if \c v is reachable from the root(s).
901 896
    ///\pre Either \ref run() or \ref start()
902 897
    ///must be called before using this function.
903 898
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
904 899
                                        Heap::PRE_HEAP; }
905 900

	
906 901
    ///Checks if a node is processed.
907 902

	
908 903
    ///Returns \c true if \c v is processed, i.e. the shortest
909 904
    ///path to \c v has already found.
910 905
    ///\pre Either \ref run() or \ref init()
911 906
    ///must be called before using this function.
912 907
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
913 908
                                          Heap::POST_HEAP; }
914 909

	
915 910
    ///The current distance of a node from the root(s).
916 911

	
917 912
    ///Returns the current distance of a node from the root(s).
918 913
    ///It may be decreased in the following processes.
919 914
    ///\pre Either \ref run() or \ref init()
920 915
    ///must be called before using this function and
921 916
    ///node \c v must be reached but not necessarily processed.
922 917
    Value currentDist(Node v) const {
923 918
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
924 919
    }
925 920

	
926 921
    ///@}
927 922
  };
928 923

	
929 924

	
930 925
  ///Default traits class of dijkstra() function.
931 926

	
932 927
  ///Default traits class of dijkstra() function.
933 928
  ///\tparam GR The type of the digraph.
934 929
  ///\tparam LM The type of the length map.
935 930
  template<class GR, class LM>
936 931
  struct DijkstraWizardDefaultTraits
937 932
  {
938 933
    ///The type of the digraph the algorithm runs on.
939 934
    typedef GR Digraph;
940 935
    ///The type of the map that stores the arc lengths.
941 936

	
942 937
    ///The type of the map that stores the arc lengths.
943 938
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
944 939
    typedef LM LengthMap;
945 940
    ///The type of the length of the arcs.
946 941
    typedef typename LM::Value Value;
947 942

	
948 943
    /// Operation traits for Dijkstra algorithm.
949 944

	
950 945
    /// This class defines the operations that are used in the algorithm.
951 946
    /// \see DijkstraDefaultOperationTraits
952 947
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
953 948

	
954 949
    /// The cross reference type used by the heap.
955 950

	
956 951
    /// The cross reference type used by the heap.
957 952
    /// Usually it is \c Digraph::NodeMap<int>.
958 953
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
959 954
    ///Instantiates a \ref HeapCrossRef.
960 955

	
961 956
    ///This function instantiates a \ref HeapCrossRef.
962 957
    /// \param g is the digraph, to which we would like to define the
963 958
    /// HeapCrossRef.
964 959
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
965 960
    {
966 961
      return new HeapCrossRef(g);
967 962
    }
968 963

	
969 964
    ///The heap type used by the Dijkstra algorithm.
970 965

	
971 966
    ///The heap type used by the Dijkstra algorithm.
972 967
    ///
973 968
    ///\sa BinHeap
974 969
    ///\sa Dijkstra
975 970
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
976 971
                    std::less<Value> > Heap;
977 972

	
978 973
    ///Instantiates a \ref Heap.
979 974

	
980 975
    ///This function instantiates a \ref Heap.
981 976
    /// \param r is the HeapCrossRef which is used.
982 977
    static Heap *createHeap(HeapCrossRef& r)
983 978
    {
984 979
      return new Heap(r);
985 980
    }
986 981

	
987 982
    ///\brief The type of the map that stores the predecessor
988 983
    ///arcs of the shortest paths.
989 984
    ///
990 985
    ///The type of the map that stores the predecessor
991 986
    ///arcs of the shortest paths.
992 987
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
993 988
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
994 989
    ///Instantiates a \ref PredMap.
995 990

	
996 991
    ///This function instantiates a \ref PredMap.
997 992
    ///\param g is the digraph, to which we would like to define the
998 993
    ///\ref PredMap.
999 994
    static PredMap *createPredMap(const Digraph &g)
1000 995
    {
1001 996
      return new PredMap(g);
1002 997
    }
1003 998

	
1004 999
    ///The type of the map that indicates which nodes are processed.
1005 1000

	
1006 1001
    ///The type of the map that indicates which nodes are processed.
1007 1002
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1008 1003
    ///By default it is a NullMap.
1009 1004
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
1010 1005
    ///Instantiates a \ref ProcessedMap.
1011 1006

	
1012 1007
    ///This function instantiates a \ref ProcessedMap.
1013 1008
    ///\param g is the digraph, to which
1014 1009
    ///we would like to define the \ref ProcessedMap.
1015 1010
#ifdef DOXYGEN
1016 1011
    static ProcessedMap *createProcessedMap(const Digraph &g)
1017 1012
#else
1018 1013
    static ProcessedMap *createProcessedMap(const Digraph &)
1019 1014
#endif
1020 1015
    {
1021 1016
      return new ProcessedMap();
1022 1017
    }
1023 1018

	
1024 1019
    ///The type of the map that stores the distances of the nodes.
1025 1020

	
1026 1021
    ///The type of the map that stores the distances of the nodes.
1027 1022
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1028 1023
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
1029 1024
    ///Instantiates a \ref DistMap.
1030 1025

	
1031 1026
    ///This function instantiates a \ref DistMap.
1032 1027
    ///\param g is the digraph, to which we would like to define
1033 1028
    ///the \ref DistMap
1034 1029
    static DistMap *createDistMap(const Digraph &g)
1035 1030
    {
1036 1031
      return new DistMap(g);
1037 1032
    }
1038 1033

	
1039 1034
    ///The type of the shortest paths.
1040 1035

	
1041 1036
    ///The type of the shortest paths.
1042 1037
    ///It must meet the \ref concepts::Path "Path" concept.
1043 1038
    typedef lemon::Path<Digraph> Path;
1044 1039
  };
1045 1040

	
1046 1041
  /// Default traits class used by \ref DijkstraWizard
1047 1042

	
1048 1043
  /// To make it easier to use Dijkstra algorithm
1049 1044
  /// we have created a wizard class.
1050 1045
  /// This \ref DijkstraWizard class needs default traits,
1051 1046
  /// as well as the \ref Dijkstra class.
1052 1047
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1053 1048
  /// \ref DijkstraWizard class.
1054 1049
  template<class GR,class LM>
1055 1050
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LM>
1056 1051
  {
1057 1052
    typedef DijkstraWizardDefaultTraits<GR,LM> Base;
1058 1053
  protected:
1059 1054
    //The type of the nodes in the digraph.
1060 1055
    typedef typename Base::Digraph::Node Node;
1061 1056

	
1062 1057
    //Pointer to the digraph the algorithm runs on.
1063 1058
    void *_g;
1064 1059
    //Pointer to the length map.
1065 1060
    void *_length;
1066 1061
    //Pointer to the map of processed nodes.
1067 1062
    void *_processed;
1068 1063
    //Pointer to the map of predecessors arcs.
1069 1064
    void *_pred;
1070 1065
    //Pointer to the map of distances.
1071 1066
    void *_dist;
1072 1067
    //Pointer to the shortest path to the target node.
1073 1068
    void *_path;
1074 1069
    //Pointer to the distance of the target node.
1075 1070
    void *_di;
1076 1071

	
1077 1072
  public:
1078 1073
    /// Constructor.
1079 1074

	
1080 1075
    /// This constructor does not require parameters, therefore it initiates
1081 1076
    /// all of the attributes to \c 0.
1082 1077
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1083 1078
                           _dist(0), _path(0), _di(0) {}
1084 1079

	
1085 1080
    /// Constructor.
1086 1081

	
1087 1082
    /// This constructor requires two parameters,
1088 1083
    /// others are initiated to \c 0.
1089 1084
    /// \param g The digraph the algorithm runs on.
1090 1085
    /// \param l The length map.
1091 1086
    DijkstraWizardBase(const GR &g,const LM &l) :
1092 1087
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1093 1088
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1094 1089
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1095 1090

	
1096 1091
  };
1097 1092

	
1098 1093
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1099 1094

	
1100 1095
  /// This auxiliary class is created to implement the
1101 1096
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1102 1097
  /// It does not have own \ref run() method, it uses the functions
1103 1098
  /// and features of the plain \ref Dijkstra.
1104 1099
  ///
1105 1100
  /// This class should only be used through the \ref dijkstra() function,
1106 1101
  /// which makes it easier to use the algorithm.
1107 1102
  template<class TR>
1108 1103
  class DijkstraWizard : public TR
1109 1104
  {
1110 1105
    typedef TR Base;
1111 1106

	
1112 1107
    ///The type of the digraph the algorithm runs on.
1113 1108
    typedef typename TR::Digraph Digraph;
1114 1109

	
1115 1110
    typedef typename Digraph::Node Node;
1116 1111
    typedef typename Digraph::NodeIt NodeIt;
1117 1112
    typedef typename Digraph::Arc Arc;
1118 1113
    typedef typename Digraph::OutArcIt OutArcIt;
1119 1114

	
1120 1115
    ///The type of the map that stores the arc lengths.
1121 1116
    typedef typename TR::LengthMap LengthMap;
1122 1117
    ///The type of the length of the arcs.
1123 1118
    typedef typename LengthMap::Value Value;
1124 1119
    ///\brief The type of the map that stores the predecessor
1125 1120
    ///arcs of the shortest paths.
1126 1121
    typedef typename TR::PredMap PredMap;
1127 1122
    ///The type of the map that stores the distances of the nodes.
1128 1123
    typedef typename TR::DistMap DistMap;
1129 1124
    ///The type of the map that indicates which nodes are processed.
1130 1125
    typedef typename TR::ProcessedMap ProcessedMap;
1131 1126
    ///The type of the shortest paths
1132 1127
    typedef typename TR::Path Path;
1133 1128
    ///The heap type used by the dijkstra algorithm.
1134 1129
    typedef typename TR::Heap Heap;
1135 1130

	
1136 1131
  public:
1137 1132

	
1138 1133
    /// Constructor.
1139 1134
    DijkstraWizard() : TR() {}
1140 1135

	
1141 1136
    /// Constructor that requires parameters.
1142 1137

	
1143 1138
    /// Constructor that requires parameters.
1144 1139
    /// These parameters will be the default values for the traits class.
1145 1140
    /// \param g The digraph the algorithm runs on.
1146 1141
    /// \param l The length map.
1147 1142
    DijkstraWizard(const Digraph &g, const LengthMap &l) :
1148 1143
      TR(g,l) {}
1149 1144

	
1150 1145
    ///Copy constructor
1151 1146
    DijkstraWizard(const TR &b) : TR(b) {}
1152 1147

	
1153 1148
    ~DijkstraWizard() {}
1154 1149

	
1155 1150
    ///Runs Dijkstra algorithm from the given source node.
1156 1151

	
1157 1152
    ///This method runs %Dijkstra algorithm from the given source node
1158 1153
    ///in order to compute the shortest path to each node.
1159 1154
    void run(Node s)
1160 1155
    {
1161
      if (s==INVALID) throw UninitializedParameter();
1162 1156
      Dijkstra<Digraph,LengthMap,TR>
1163 1157
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1164 1158
             *reinterpret_cast<const LengthMap*>(Base::_length));
1165 1159
      if (Base::_pred)
1166 1160
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1167 1161
      if (Base::_dist)
1168 1162
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1169 1163
      if (Base::_processed)
1170 1164
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1171 1165
      dijk.run(s);
1172 1166
    }
1173 1167

	
1174 1168
    ///Finds the shortest path between \c s and \c t.
1175 1169

	
1176 1170
    ///This method runs the %Dijkstra algorithm from node \c s
1177 1171
    ///in order to compute the shortest path to node \c t
1178 1172
    ///(it stops searching when \c t is processed).
1179 1173
    ///
1180 1174
    ///\return \c true if \c t is reachable form \c s.
1181 1175
    bool run(Node s, Node t)
1182 1176
    {
1183
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1184 1177
      Dijkstra<Digraph,LengthMap,TR>
1185 1178
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1186 1179
             *reinterpret_cast<const LengthMap*>(Base::_length));
1187 1180
      if (Base::_pred)
1188 1181
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1189 1182
      if (Base::_dist)
1190 1183
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1191 1184
      if (Base::_processed)
1192 1185
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1193 1186
      dijk.run(s,t);
1194 1187
      if (Base::_path)
1195 1188
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1196 1189
      if (Base::_di)
1197 1190
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1198 1191
      return dijk.reached(t);
1199 1192
    }
1200 1193

	
1201 1194
    template<class T>
1202 1195
    struct SetPredMapBase : public Base {
1203 1196
      typedef T PredMap;
1204 1197
      static PredMap *createPredMap(const Digraph &) { return 0; };
1205 1198
      SetPredMapBase(const TR &b) : TR(b) {}
1206 1199
    };
1207 1200
    ///\brief \ref named-func-param "Named parameter"
1208 1201
    ///for setting \ref PredMap object.
1209 1202
    ///
1210 1203
    ///\ref named-func-param "Named parameter"
1211 1204
    ///for setting \ref PredMap object.
1212 1205
    template<class T>
1213 1206
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1214 1207
    {
1215 1208
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1216 1209
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1217 1210
    }
1218 1211

	
1219 1212
    template<class T>
1220 1213
    struct SetDistMapBase : public Base {
1221 1214
      typedef T DistMap;
1222 1215
      static DistMap *createDistMap(const Digraph &) { return 0; };
1223 1216
      SetDistMapBase(const TR &b) : TR(b) {}
1224 1217
    };
1225 1218
    ///\brief \ref named-func-param "Named parameter"
1226 1219
    ///for setting \ref DistMap object.
1227 1220
    ///
1228 1221
    ///\ref named-func-param "Named parameter"
1229 1222
    ///for setting \ref DistMap object.
1230 1223
    template<class T>
1231 1224
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1232 1225
    {
1233 1226
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1234 1227
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1235 1228
    }
1236 1229

	
1237 1230
    template<class T>
1238 1231
    struct SetProcessedMapBase : public Base {
1239 1232
      typedef T ProcessedMap;
1240 1233
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1241 1234
      SetProcessedMapBase(const TR &b) : TR(b) {}
1242 1235
    };
1243 1236
    ///\brief \ref named-func-param "Named parameter"
1244 1237
    ///for setting \ref ProcessedMap object.
1245 1238
    ///
1246 1239
    /// \ref named-func-param "Named parameter"
1247 1240
    ///for setting \ref ProcessedMap object.
1248 1241
    template<class T>
1249 1242
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1250 1243
    {
1251 1244
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1252 1245
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1253 1246
    }
1254 1247

	
1255 1248
    template<class T>
1256 1249
    struct SetPathBase : public Base {
1257 1250
      typedef T Path;
1258 1251
      SetPathBase(const TR &b) : TR(b) {}
1259 1252
    };
1260 1253
    ///\brief \ref named-func-param "Named parameter"
1261 1254
    ///for getting the shortest path to the target node.
1262 1255
    ///
1263 1256
    ///\ref named-func-param "Named parameter"
1264 1257
    ///for getting the shortest path to the target node.
1265 1258
    template<class T>
1266 1259
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1267 1260
    {
1268 1261
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1269 1262
      return DijkstraWizard<SetPathBase<T> >(*this);
1270 1263
    }
1271 1264

	
1272 1265
    ///\brief \ref named-func-param "Named parameter"
1273 1266
    ///for getting the distance of the target node.
1274 1267
    ///
1275 1268
    ///\ref named-func-param "Named parameter"
1276 1269
    ///for getting the distance of the target node.
1277 1270
    DijkstraWizard dist(const Value &d)
1278 1271
    {
1279 1272
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1280 1273
      return *this;
1281 1274
    }
1282 1275

	
1283 1276
  };
1284 1277

	
1285 1278
  ///Function-type interface for Dijkstra algorithm.
1286 1279

	
1287 1280
  /// \ingroup shortest_path
1288 1281
  ///Function-type interface for Dijkstra algorithm.
1289 1282
  ///
1290 1283
  ///This function also has several \ref named-func-param "named parameters",
1291 1284
  ///they are declared as the members of class \ref DijkstraWizard.
1292 1285
  ///The following examples show how to use these parameters.
1293 1286
  ///\code
1294 1287
  ///  // Compute shortest path from node s to each node
1295 1288
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1296 1289
  ///
1297 1290
  ///  // Compute shortest path from s to t
1298 1291
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1299 1292
  ///\endcode
1300 1293
  ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()"
1301 1294
  ///to the end of the parameter list.
1302 1295
  ///\sa DijkstraWizard
1303 1296
  ///\sa Dijkstra
1304 1297
  template<class GR, class LM>
1305 1298
  DijkstraWizard<DijkstraWizardBase<GR,LM> >
1306 1299
  dijkstra(const GR &digraph, const LM &length)
1307 1300
  {
1308 1301
    return DijkstraWizard<DijkstraWizardBase<GR,LM> >(digraph,length);
1309 1302
  }
1310 1303

	
1311 1304
} //END OF NAMESPACE LEMON
1312 1305

	
1313 1306
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ERROR_H
20 20
#define LEMON_ERROR_H
21 21

	
22 22
/// \ingroup exceptions
23 23
/// \file
24 24
/// \brief Basic exception classes and error handling.
25 25

	
26 26
#include <exception>
27 27
#include <string>
28 28
#include <sstream>
29 29
#include <iostream>
30 30
#include <cstdlib>
31 31
#include <memory>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \addtogroup exceptions
36 36
  /// @{
37 37

	
38
  /// \brief Exception safe wrapper class.
38
  /// \brief Generic exception class.
39 39
  ///
40
  /// Exception safe wrapper class to implement the members of exceptions.
41
  template <typename _Type>
42
  class ExceptionMember {
43
  public:
44
    typedef _Type Type;
45

	
46
    ExceptionMember() throw() {
47
      try {
48
        ptr.reset(new Type());
49
      } catch (...) {}
50
    }
51

	
52
    ExceptionMember(const Type& type) throw() {
53
      try {
54
        ptr.reset(new Type());
55
        if (ptr.get() == 0) return;
56
        *ptr = type;
57
      } catch (...) {}
58
    }
59

	
60
    ExceptionMember(const ExceptionMember& copy) throw() {
61
      try {
62
        if (!copy.valid()) return;
63
        ptr.reset(new Type());
64
        if (ptr.get() == 0) return;
65
        *ptr = copy.get();
66
      } catch (...) {}
67
    }
68

	
69
    ExceptionMember& operator=(const ExceptionMember& copy) throw() {
70
      if (ptr.get() == 0) return;
71
      try {
72
        if (!copy.valid()) return;
73
        *ptr = copy.get();
74
      } catch (...) {}
75
    }
76

	
77
    void set(const Type& type) throw() {
78
      if (ptr.get() == 0) return;
79
      try {
80
        *ptr = type;
81
      } catch (...) {}
82
    }
83

	
84
    const Type& get() const {
85
      return *ptr;
86
    }
87

	
88
    bool valid() const throw() {
89
      return ptr.get() != 0;
90
    }
91

	
92
  private:
93
    std::auto_ptr<_Type> ptr;
94
  };
95

	
96
  /// Exception-safe convenient error message builder class.
97

	
98
  /// Helper class which provides a convenient ostream-like (operator <<
99
  /// based) interface to create a string message. Mostly useful in
100
  /// exception classes (therefore the name).
101
  class ErrorMessage {
102
  protected:
103
    ///\e
104

	
105
    mutable std::auto_ptr<std::ostringstream> buf;
106

	
107
    ///\e
108
    bool init() throw() {
109
      try {
110
        buf.reset(new std::ostringstream);
111
      }
112
      catch(...) {
113
        buf.reset();
114
      }
115
      return buf.get();
116
    }
117

	
118
  public:
119

	
120
    ///\e
121
    ErrorMessage() throw() { init(); }
122

	
123
    ErrorMessage(const ErrorMessage& em) throw() : buf(em.buf) { }
124

	
125
    ///\e
126
    ErrorMessage(const char *msg) throw() {
127
      init();
128
      *this << msg;
129
    }
130

	
131
    ///\e
132
    ErrorMessage(const std::string &msg) throw() {
133
      init();
134
      *this << msg;
135
    }
136

	
137
    ///\e
138
    template <typename T>
139
    ErrorMessage& operator<<(const T &t) throw() {
140
      if( ! buf.get() ) return *this;
141

	
142
      try {
143
        *buf << t;
144
      }
145
      catch(...) {
146
        buf.reset();
147
      }
148
      return *this;
149
    }
150

	
151
    ///\e
152
    const char* message() throw() {
153
      if( ! buf.get() ) return 0;
154

	
155
      const char* mes = 0;
156
      try {
157
        mes = buf->str().c_str();
158
      }
159
      catch(...) {}
160
      return mes;
161
    }
162

	
163
  };
164

	
165
  /// Generic exception class.
166

	
167 40
  /// Base class for exceptions used in LEMON.
168 41
  ///
169 42
  class Exception : public std::exception {
170 43
  public:
171
    ///\e
172
    Exception() {}
173
    ///\e
44
    ///Constructor
45
    Exception() throw() {}
46
    ///Virtual destructor
174 47
    virtual ~Exception() throw() {}
175
    ///\e
48
    ///A short description of the exception
176 49
    virtual const char* what() const throw() {
177 50
      return "lemon::Exception";
178 51
    }
179 52
  };
180 53

	
181
  /// One of the two main subclasses of \ref Exception.
54
  /// \brief Input-Output error
55
  ///
56
  /// This exception is thrown when a file operation cannot be
57
  /// succeeded.
58
  class IoError : public Exception {
59
  protected:
60
    std::string _message;
61
    std::string _file;
182 62

	
183
  /// Logic errors represent problems in the internal logic of a program;
184
  /// in theory, these are preventable, and even detectable before the
185
  /// program runs (e.g. violations of class invariants).
186
  ///
187
  /// A typical example for this is \ref UninitializedParameter.
188
  class LogicError : public Exception {
63
    mutable std::string _what;
189 64
  public:
65

	
66
    /// Copy constructor
67
    IoError(const IoError &error) throw() : Exception() {
68
      message(error._message);
69
      file(error._file);
70
    }
71

	
72
    /// Constructor
73
    explicit IoError(const char *message) throw() {
74
      IoError::message(message);
75
    }
76

	
77
    /// Constructor
78
    explicit IoError(const std::string &message) throw() {
79
      IoError::message(message);
80
    }
81

	
82
    /// Constructor
83
    explicit IoError(const char *message,
84
                     const std::string &file) throw() {
85
      IoError::message(message);
86
      IoError::file(file);
87
    }
88

	
89
    /// Constructor
90
    explicit IoError(const std::string &message,
91
                     const std::string &file) throw() {
92
      IoError::message(message);
93
      IoError::file(file);
94
    }
95

	
96
    /// Virtual destructor
97
    virtual ~IoError() throw() {}
98

	
99
    /// Set the error message
100
    void message(const char *message) throw() {
101
      try {
102
        _message = message;
103
      } catch (...) {}
104
    }
105

	
106
    /// Set the error message
107
    void message(const std::string& message) throw() {
108
      try {
109
        _message = message;
110
      } catch (...) {}
111
    }
112

	
113
    /// Set the file name
114
    void file(const std::string &file) throw() {
115
      try {
116
        _file = file;
117
      } catch (...) {}
118
    }
119

	
120
    /// Returns the error message
121
    const std::string& message() const throw() {
122
      return _message;
123
    }
124

	
125
    /// \brief Returns the filename
126
    ///
127
    /// Returns the filename or an empty string if it was not specified.
128
    const std::string& file() const throw() {
129
      return _file;
130
    }
131

	
132
    /// \brief Returns a short error message
133
    ///
134
    /// Returns a short error message which contains the message and the
135
    /// file name.
190 136
    virtual const char* what() const throw() {
191
      return "lemon::LogicError";
137
      try {
138
        _what.clear();
139
        std::ostringstream oss;
140
        oss << "lemon:IoError" << ": ";
141
        oss << _message;
142
        if (!_file.empty()) {
143
          oss << " ('" << _file << "')";
144
        }
145
        _what = oss.str();
146
      }
147
      catch (...) {}
148
      if (!_what.empty()) return _what.c_str();
149
      else return "lemon:IoError";
192 150
    }
151

	
193 152
  };
194 153

	
195
  /// \ref Exception for uninitialized parameters.
196

	
197
  /// This error represents problems in the initialization
198
  /// of the parameters of the algorithms.
199
  class UninitializedParameter : public LogicError {
200
  public:
201
    virtual const char* what() const throw() {
202
      return "lemon::UninitializedParameter";
203
    }
204
  };
205

	
206

	
207
  /// One of the two main subclasses of \ref Exception.
208

	
209
  /// Runtime errors represent problems outside the scope of a program;
210
  /// they cannot be easily predicted and can generally only be caught
211
  /// as the program executes.
212
  class RuntimeError : public Exception {
213
  public:
214
    virtual const char* what() const throw() {
215
      return "lemon::RuntimeError";
216
    }
217
  };
218

	
219
  ///\e
220
  class RangeError : public RuntimeError {
221
  public:
222
    virtual const char* what() const throw() {
223
      return "lemon::RangeError";
224
    }
225
  };
226

	
227
  ///\e
228
  class IoError : public RuntimeError {
229
  public:
230
    virtual const char* what() const throw() {
231
      return "lemon::IoError";
232
    }
233
  };
234

	
235
  ///\e
236
  class DataFormatError : public IoError {
154
  /// \brief Format error
155
  ///
156
  /// This exception is thrown when an input file has wrong
157
  /// format or a data representation is not legal.
158
  class FormatError : public Exception {
237 159
  protected:
238
    ExceptionMember<std::string> _message;
239
    ExceptionMember<std::string> _file;
160
    std::string _message;
161
    std::string _file;
240 162
    int _line;
241 163

	
242
    mutable ExceptionMember<std::string> _message_holder;
164
    mutable std::string _what;
243 165
  public:
244 166

	
245
    DataFormatError(const DataFormatError &dfe) :
246
      IoError(dfe), _message(dfe._message), _file(dfe._file),
247
      _line(dfe._line) {}
248

	
249
    ///\e
250
    explicit DataFormatError(const char *the_message)
251
      : _message(the_message), _line(0) {}
252

	
253
    ///\e
254
    DataFormatError(const std::string &file_name, int line_num,
255
                    const char *the_message)
256
      : _message(the_message), _line(line_num) { file(file_name); }
257

	
258
    ///\e
259
    void line(int ln) { _line = ln; }
260
    ///\e
261
    void message(const std::string& msg) { _message.set(msg); }
262
    ///\e
263
    void file(const std::string &fl) { _file.set(fl); }
264

	
265
    ///\e
266
    int line() const { return _line; }
267
    ///\e
268
    const char* message() const {
269
      if (_message.valid() && !_message.get().empty()) {
270
        return _message.get().c_str();
271
      } else {
272
        return 0;
273
      }
167
    /// Copy constructor
168
    FormatError(const FormatError &error) throw() : Exception() {
169
      message(error._message);
170
      file(error._file);
171
      line(error._line);
274 172
    }
275 173

	
276
    /// \brief Returns the filename.
277
    ///
278
    /// Returns \e null if the filename was not specified.
279
    const char* file() const {
280
      if (_file.valid() && !_file.get().empty()) {
281
        return _file.get().c_str();
282
      } else {
283
        return 0;
284
      }
174
    /// Constructor
175
    explicit FormatError(const char *message) throw() {
176
      FormatError::message(message);
177
      _line = 0;
285 178
    }
286 179

	
287
    ///\e
180
    /// Constructor
181
    explicit FormatError(const std::string &message) throw() {
182
      FormatError::message(message);
183
      _line = 0;
184
    }
185

	
186
    /// Constructor
187
    explicit FormatError(const char *message,
188
                         const std::string &file, int line = 0) throw() {
189
      FormatError::message(message);
190
      FormatError::file(file);
191
      FormatError::line(line);
192
    }
193

	
194
    /// Constructor
195
    explicit FormatError(const std::string &message,
196
                         const std::string &file, int line = 0) throw() {
197
      FormatError::message(message);
198
      FormatError::file(file);
199
      FormatError::line(line);
200
    }
201

	
202
    /// Virtual destructor
203
    virtual ~FormatError() throw() {}
204

	
205
    /// Set the line number
206
    void line(int line) throw() { _line = line; }
207

	
208
    /// Set the error message
209
    void message(const char *message) throw() {
210
      try {
211
        _message = message;
212
      } catch (...) {}
213
    }
214

	
215
    /// Set the error message
216
    void message(const std::string& message) throw() {
217
      try {
218
        _message = message;
219
      } catch (...) {}
220
    }
221

	
222
    /// Set the file name
223
    void file(const std::string &file) throw() {
224
      try {
225
        _file = file;
226
      } catch (...) {}
227
    }
228

	
229
    /// \brief Returns the line number
230
    ///
231
    /// Returns the line number or zero if it was not specified.
232
    int line() const throw() { return _line; }
233

	
234
    /// Returns the error message
235
    const std::string& message() const throw() {
236
      return _message;
237
    }
238

	
239
    /// \brief Returns the filename
240
    ///
241
    /// Returns the filename or an empty string if it was not specified.
242
    const std::string& file() const throw() {
243
      return _file;
244
    }
245

	
246
    /// \brief Returns a short error message
247
    ///
248
    /// Returns a short error message which contains the message, the
249
    /// file name and the line number.
288 250
    virtual const char* what() const throw() {
289 251
      try {
290
        std::ostringstream ostr;
291
        ostr << "lemon:DataFormatError" << ": ";
292
        if (message()) ostr << message();
293
        if( file() || line() != 0 ) {
294
          ostr << " (";
295
          if( file() ) ostr << "in file '" << file() << "'";
296
          if( file() && line() != 0 ) ostr << " ";
297
          if( line() != 0 ) ostr << "at line " << line();
298
          ostr << ")";
252
        _what.clear();
253
        std::ostringstream oss;
254
        oss << "lemon:FormatError" << ": ";
255
        oss << _message;
256
        if (!_file.empty() || _line != 0) {
257
          oss << " (";
258
          if (!_file.empty()) oss << "in file '" << _file << "'";
259
          if (!_file.empty() && _line != 0) oss << " ";
260
          if (_line != 0) oss << "at line " << _line;
261
          oss << ")";
299 262
        }
300
        _message_holder.set(ostr.str());
263
        _what = oss.str();
301 264
      }
302 265
      catch (...) {}
303
      if( _message_holder.valid()) return _message_holder.get().c_str();
304
      return "lemon:DataFormatError";
266
      if (!_what.empty()) return _what.c_str();
267
      else return "lemon:FormatError";
305 268
    }
306 269

	
307
    virtual ~DataFormatError() throw() {}
308
  };
309

	
310
  ///\e
311
  class FileOpenError : public IoError {
312
  protected:
313
    ExceptionMember<std::string> _file;
314

	
315
    mutable ExceptionMember<std::string> _message_holder;
316
  public:
317

	
318
    FileOpenError(const FileOpenError &foe) :
319
      IoError(foe), _file(foe._file) {}
320

	
321
    ///\e
322
    explicit FileOpenError(const std::string& fl)
323
      : _file(fl) {}
324

	
325

	
326
    ///\e
327
    void file(const std::string &fl) { _file.set(fl); }
328

	
329
    /// \brief Returns the filename.
330
    ///
331
    /// Returns \e null if the filename was not specified.
332
    const char* file() const {
333
      if (_file.valid() && !_file.get().empty()) {
334
        return _file.get().c_str();
335
      } else {
336
        return 0;
337
      }
338
    }
339

	
340
    ///\e
341
    virtual const char* what() const throw() {
342
      try {
343
        std::ostringstream ostr;
344
        ostr << "lemon::FileOpenError" << ": ";
345
        ostr << "Cannot open file - " << file();
346
        _message_holder.set(ostr.str());
347
      }
348
      catch (...) {}
349
      if( _message_holder.valid()) return _message_holder.get().c_str();
350
      return "lemon::FileOpenError";
351
    }
352
    virtual ~FileOpenError() throw() {}
353
  };
354

	
355
  class IoParameterError : public IoError {
356
  protected:
357
    ExceptionMember<std::string> _message;
358
    ExceptionMember<std::string> _file;
359

	
360
    mutable ExceptionMember<std::string> _message_holder;
361
  public:
362

	
363
    IoParameterError(const IoParameterError &ile) :
364
      IoError(ile), _message(ile._message), _file(ile._file) {}
365

	
366
    ///\e
367
    explicit IoParameterError(const char *the_message)
368
      : _message(the_message) {}
369

	
370
    ///\e
371
    IoParameterError(const char *file_name, const char *the_message)
372
      : _message(the_message), _file(file_name) {}
373

	
374
     ///\e
375
    void message(const std::string& msg) { _message.set(msg); }
376
    ///\e
377
    void file(const std::string &fl) { _file.set(fl); }
378

	
379
     ///\e
380
    const char* message() const {
381
      if (_message.valid()) {
382
        return _message.get().c_str();
383
      } else {
384
        return 0;
385
      }
386
    }
387

	
388
    /// \brief Returns the filename.
389
    ///
390
    /// Returns \c 0 if the filename was not specified.
391
    const char* file() const {
392
      if (_file.valid()) {
393
        return _file.get().c_str();
394
      } else {
395
        return 0;
396
      }
397
    }
398

	
399
    ///\e
400
    virtual const char* what() const throw() {
401
      try {
402
        std::ostringstream ostr;
403
        if (message()) ostr << message();
404
        if (file()) ostr << "(when reading file '" << file() << "')";
405
        _message_holder.set(ostr.str());
406
      }
407
      catch (...) {}
408
      if( _message_holder.valid() ) return _message_holder.get().c_str();
409
      return "lemon:IoParameterError";
410
    }
411
    virtual ~IoParameterError() throw() {}
412 270
  };
413 271

	
414 272
  /// @}
415 273

	
416 274
}
417 275

	
418 276
#endif // LEMON_ERROR_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GRAPH_TO_EPS_H
20 20
#define LEMON_GRAPH_TO_EPS_H
21 21

	
22 22
#include<iostream>
23 23
#include<fstream>
24 24
#include<sstream>
25 25
#include<algorithm>
26 26
#include<vector>
27 27

	
28 28
#ifndef WIN32
29 29
#include<sys/time.h>
30 30
#include<ctime>
31 31
#else
32 32
#define WIN32_LEAN_AND_MEAN
33 33
#define NOMINMAX
34 34
#include<windows.h>
35 35
#endif
36 36

	
37 37
#include<lemon/math.h>
38 38
#include<lemon/core.h>
39 39
#include<lemon/dim2.h>
40 40
#include<lemon/maps.h>
41 41
#include<lemon/color.h>
42 42
#include<lemon/bits/bezier.h>
43
#include<lemon/error.h>
43 44

	
44 45

	
45 46
///\ingroup eps_io
46 47
///\file
47 48
///\brief A well configurable tool for visualizing graphs
48 49

	
49 50
namespace lemon {
50 51

	
51 52
  namespace _graph_to_eps_bits {
52 53
    template<class MT>
53 54
    class _NegY {
54 55
    public:
55 56
      typedef typename MT::Key Key;
56 57
      typedef typename MT::Value Value;
57 58
      const MT &map;
58 59
      int yscale;
59 60
      _NegY(const MT &m,bool b) : map(m), yscale(1-b*2) {}
60 61
      Value operator[](Key n) { return Value(map[n].x,map[n].y*yscale);}
61 62
    };
62 63
  }
63 64

	
64 65
///Default traits class of \ref GraphToEps
65 66

	
66 67
///Default traits class of \ref GraphToEps.
67 68
///
68 69
///\c G is the type of the underlying graph.
69 70
template<class G>
70 71
struct DefaultGraphToEpsTraits
71 72
{
72 73
  typedef G Graph;
73 74
  typedef typename Graph::Node Node;
74 75
  typedef typename Graph::NodeIt NodeIt;
75 76
  typedef typename Graph::Arc Arc;
76 77
  typedef typename Graph::ArcIt ArcIt;
77 78
  typedef typename Graph::InArcIt InArcIt;
78 79
  typedef typename Graph::OutArcIt OutArcIt;
79 80

	
80 81

	
81 82
  const Graph &g;
82 83

	
83 84
  std::ostream& os;
84 85

	
85 86
  typedef ConstMap<typename Graph::Node,dim2::Point<double> > CoordsMapType;
86 87
  CoordsMapType _coords;
87 88
  ConstMap<typename Graph::Node,double > _nodeSizes;
88 89
  ConstMap<typename Graph::Node,int > _nodeShapes;
89 90

	
90 91
  ConstMap<typename Graph::Node,Color > _nodeColors;
91 92
  ConstMap<typename Graph::Arc,Color > _arcColors;
92 93

	
93 94
  ConstMap<typename Graph::Arc,double > _arcWidths;
94 95

	
95 96
  double _arcWidthScale;
96 97

	
97 98
  double _nodeScale;
98 99
  double _xBorder, _yBorder;
99 100
  double _scale;
100 101
  double _nodeBorderQuotient;
101 102

	
102 103
  bool _drawArrows;
103 104
  double _arrowLength, _arrowWidth;
104 105

	
105 106
  bool _showNodes, _showArcs;
106 107

	
107 108
  bool _enableParallel;
108 109
  double _parArcDist;
109 110

	
110 111
  bool _showNodeText;
111 112
  ConstMap<typename Graph::Node,bool > _nodeTexts;
112 113
  double _nodeTextSize;
113 114

	
114 115
  bool _showNodePsText;
115 116
  ConstMap<typename Graph::Node,bool > _nodePsTexts;
116 117
  char *_nodePsTextsPreamble;
117 118

	
118 119
  bool _undirected;
119 120

	
120 121
  bool _pleaseRemoveOsStream;
121 122

	
122 123
  bool _scaleToA4;
123 124

	
124 125
  std::string _title;
125 126
  std::string _copyright;
126 127

	
127 128
  enum NodeTextColorType
128 129
    { DIST_COL=0, DIST_BW=1, CUST_COL=2, SAME_COL=3 } _nodeTextColorType;
129 130
  ConstMap<typename Graph::Node,Color > _nodeTextColors;
130 131

	
131 132
  bool _autoNodeScale;
132 133
  bool _autoArcWidthScale;
133 134

	
134 135
  bool _absoluteNodeSizes;
135 136
  bool _absoluteArcWidths;
136 137

	
137 138
  bool _negY;
138 139

	
139 140
  bool _preScale;
140 141
  ///Constructor
141 142

	
142 143
  ///Constructor
143 144
  ///\param _g  Reference to the graph to be printed.
144 145
  ///\param _os Reference to the output stream.
145 146
  ///\param _os Reference to the output stream.
146 147
  ///By default it is <tt>std::cout</tt>.
147 148
  ///\param _pros If it is \c true, then the \c ostream referenced by \c _os
148 149
  ///will be explicitly deallocated by the destructor.
149 150
  DefaultGraphToEpsTraits(const G &_g,std::ostream& _os=std::cout,
150 151
                          bool _pros=false) :
151 152
    g(_g), os(_os),
152 153
    _coords(dim2::Point<double>(1,1)), _nodeSizes(1), _nodeShapes(0),
153 154
    _nodeColors(WHITE), _arcColors(BLACK),
154 155
    _arcWidths(1.0), _arcWidthScale(0.003),
155 156
    _nodeScale(.01), _xBorder(10), _yBorder(10), _scale(1.0),
156 157
    _nodeBorderQuotient(.1),
157 158
    _drawArrows(false), _arrowLength(1), _arrowWidth(0.3),
158 159
    _showNodes(true), _showArcs(true),
159 160
    _enableParallel(false), _parArcDist(1),
160 161
    _showNodeText(false), _nodeTexts(false), _nodeTextSize(1),
161 162
    _showNodePsText(false), _nodePsTexts(false), _nodePsTextsPreamble(0),
162 163
    _undirected(lemon::UndirectedTagIndicator<G>::value),
163 164
    _pleaseRemoveOsStream(_pros), _scaleToA4(false),
164 165
    _nodeTextColorType(SAME_COL), _nodeTextColors(BLACK),
165 166
    _autoNodeScale(false),
166 167
    _autoArcWidthScale(false),
167 168
    _absoluteNodeSizes(false),
168 169
    _absoluteArcWidths(false),
169 170
    _negY(false),
170 171
    _preScale(true)
171 172
  {}
172 173
};
173 174

	
174 175
///Auxiliary class to implement the named parameters of \ref graphToEps()
175 176

	
176 177
///Auxiliary class to implement the named parameters of \ref graphToEps().
177 178
///
178 179
///For detailed examples see the \ref graph_to_eps_demo.cc demo file.
179 180
template<class T> class GraphToEps : public T
180 181
{
181 182
  // Can't believe it is required by the C++ standard
182 183
  using T::g;
183 184
  using T::os;
184 185

	
185 186
  using T::_coords;
186 187
  using T::_nodeSizes;
187 188
  using T::_nodeShapes;
188 189
  using T::_nodeColors;
189 190
  using T::_arcColors;
190 191
  using T::_arcWidths;
191 192

	
192 193
  using T::_arcWidthScale;
193 194
  using T::_nodeScale;
194 195
  using T::_xBorder;
195 196
  using T::_yBorder;
196 197
  using T::_scale;
197 198
  using T::_nodeBorderQuotient;
198 199

	
199 200
  using T::_drawArrows;
200 201
  using T::_arrowLength;
201 202
  using T::_arrowWidth;
202 203

	
203 204
  using T::_showNodes;
204 205
  using T::_showArcs;
205 206

	
206 207
  using T::_enableParallel;
207 208
  using T::_parArcDist;
208 209

	
209 210
  using T::_showNodeText;
210 211
  using T::_nodeTexts;
211 212
  using T::_nodeTextSize;
212 213

	
213 214
  using T::_showNodePsText;
214 215
  using T::_nodePsTexts;
215 216
  using T::_nodePsTextsPreamble;
216 217

	
217 218
  using T::_undirected;
218 219

	
219 220
  using T::_pleaseRemoveOsStream;
220 221

	
221 222
  using T::_scaleToA4;
222 223

	
223 224
  using T::_title;
224 225
  using T::_copyright;
225 226

	
226 227
  using T::NodeTextColorType;
227 228
  using T::CUST_COL;
228 229
  using T::DIST_COL;
229 230
  using T::DIST_BW;
230 231
  using T::_nodeTextColorType;
231 232
  using T::_nodeTextColors;
232 233

	
233 234
  using T::_autoNodeScale;
234 235
  using T::_autoArcWidthScale;
235 236

	
236 237
  using T::_absoluteNodeSizes;
237 238
  using T::_absoluteArcWidths;
238 239

	
239 240

	
240 241
  using T::_negY;
241 242
  using T::_preScale;
242 243

	
243 244
  // dradnats ++C eht yb deriuqer si ti eveileb t'naC
244 245

	
245 246
  typedef typename T::Graph Graph;
246 247
  typedef typename Graph::Node Node;
247 248
  typedef typename Graph::NodeIt NodeIt;
248 249
  typedef typename Graph::Arc Arc;
249 250
  typedef typename Graph::ArcIt ArcIt;
250 251
  typedef typename Graph::InArcIt InArcIt;
251 252
  typedef typename Graph::OutArcIt OutArcIt;
252 253

	
253 254
  static const int INTERPOL_PREC;
254 255
  static const double A4HEIGHT;
255 256
  static const double A4WIDTH;
256 257
  static const double A4BORDER;
257 258

	
258 259
  bool dontPrint;
259 260

	
260 261
public:
261 262
  ///Node shapes
262 263

	
263 264
  ///Node shapes.
264 265
  ///
265 266
  enum NodeShapes {
266 267
    /// = 0
267 268
    ///\image html nodeshape_0.png
268 269
    ///\image latex nodeshape_0.eps "CIRCLE shape (0)" width=2cm
269 270
    CIRCLE=0,
270 271
    /// = 1
271 272
    ///\image html nodeshape_1.png
272 273
    ///\image latex nodeshape_1.eps "SQUARE shape (1)" width=2cm
273 274
    ///
274 275
    SQUARE=1,
275 276
    /// = 2
276 277
    ///\image html nodeshape_2.png
277 278
    ///\image latex nodeshape_2.eps "DIAMOND shape (2)" width=2cm
278 279
    ///
279 280
    DIAMOND=2,
280 281
    /// = 3
281 282
    ///\image html nodeshape_3.png
282 283
    ///\image latex nodeshape_2.eps "MALE shape (4)" width=2cm
283 284
    ///
284 285
    MALE=3,
285 286
    /// = 4
286 287
    ///\image html nodeshape_4.png
287 288
    ///\image latex nodeshape_2.eps "FEMALE shape (4)" width=2cm
288 289
    ///
289 290
    FEMALE=4
290 291
  };
291 292

	
292 293
private:
293 294
  class arcLess {
294 295
    const Graph &g;
295 296
  public:
296 297
    arcLess(const Graph &_g) : g(_g) {}
297 298
    bool operator()(Arc a,Arc b) const
298 299
    {
299 300
      Node ai=std::min(g.source(a),g.target(a));
300 301
      Node aa=std::max(g.source(a),g.target(a));
301 302
      Node bi=std::min(g.source(b),g.target(b));
302 303
      Node ba=std::max(g.source(b),g.target(b));
303 304
      return ai<bi ||
304 305
        (ai==bi && (aa < ba ||
305 306
                    (aa==ba && ai==g.source(a) && bi==g.target(b))));
306 307
    }
307 308
  };
308 309
  bool isParallel(Arc e,Arc f) const
309 310
  {
310 311
    return (g.source(e)==g.source(f)&&
311 312
            g.target(e)==g.target(f)) ||
312 313
      (g.source(e)==g.target(f)&&
313 314
       g.target(e)==g.source(f));
314 315
  }
315 316
  template<class TT>
316 317
  static std::string psOut(const dim2::Point<TT> &p)
317 318
    {
318 319
      std::ostringstream os;
319 320
      os << p.x << ' ' << p.y;
320 321
      return os.str();
321 322
    }
322 323
  static std::string psOut(const Color &c)
323 324
    {
324 325
      std::ostringstream os;
325 326
      os << c.red() << ' ' << c.green() << ' ' << c.blue();
326 327
      return os.str();
327 328
    }
328 329

	
329 330
public:
330 331
  GraphToEps(const T &t) : T(t), dontPrint(false) {};
331 332

	
332 333
  template<class X> struct CoordsTraits : public T {
333 334
  typedef X CoordsMapType;
334 335
    const X &_coords;
335 336
    CoordsTraits(const T &t,const X &x) : T(t), _coords(x) {}
336 337
  };
337 338
  ///Sets the map of the node coordinates
338 339

	
339 340
  ///Sets the map of the node coordinates.
340 341
  ///\param x must be a node map with \ref dim2::Point "dim2::Point<double>" or
341 342
  ///\ref dim2::Point "dim2::Point<int>" values.
342 343
  template<class X> GraphToEps<CoordsTraits<X> > coords(const X &x) {
343 344
    dontPrint=true;
344 345
    return GraphToEps<CoordsTraits<X> >(CoordsTraits<X>(*this,x));
345 346
  }
346 347
  template<class X> struct NodeSizesTraits : public T {
347 348
    const X &_nodeSizes;
348 349
    NodeSizesTraits(const T &t,const X &x) : T(t), _nodeSizes(x) {}
349 350
  };
350 351
  ///Sets the map of the node sizes
351 352

	
352 353
  ///Sets the map of the node sizes.
353 354
  ///\param x must be a node map with \c double (or convertible) values.
354 355
  template<class X> GraphToEps<NodeSizesTraits<X> > nodeSizes(const X &x)
355 356
  {
356 357
    dontPrint=true;
357 358
    return GraphToEps<NodeSizesTraits<X> >(NodeSizesTraits<X>(*this,x));
358 359
  }
359 360
  template<class X> struct NodeShapesTraits : public T {
360 361
    const X &_nodeShapes;
361 362
    NodeShapesTraits(const T &t,const X &x) : T(t), _nodeShapes(x) {}
362 363
  };
363 364
  ///Sets the map of the node shapes
364 365

	
365 366
  ///Sets the map of the node shapes.
366 367
  ///The available shape values
367 368
  ///can be found in \ref NodeShapes "enum NodeShapes".
368 369
  ///\param x must be a node map with \c int (or convertible) values.
369 370
  ///\sa NodeShapes
370 371
  template<class X> GraphToEps<NodeShapesTraits<X> > nodeShapes(const X &x)
371 372
  {
372 373
    dontPrint=true;
373 374
    return GraphToEps<NodeShapesTraits<X> >(NodeShapesTraits<X>(*this,x));
374 375
  }
375 376
  template<class X> struct NodeTextsTraits : public T {
376 377
    const X &_nodeTexts;
377 378
    NodeTextsTraits(const T &t,const X &x) : T(t), _nodeTexts(x) {}
378 379
  };
379 380
  ///Sets the text printed on the nodes
380 381

	
381 382
  ///Sets the text printed on the nodes.
382 383
  ///\param x must be a node map with type that can be pushed to a standard
383 384
  ///\c ostream.
384 385
  template<class X> GraphToEps<NodeTextsTraits<X> > nodeTexts(const X &x)
385 386
  {
386 387
    dontPrint=true;
387 388
    _showNodeText=true;
388 389
    return GraphToEps<NodeTextsTraits<X> >(NodeTextsTraits<X>(*this,x));
389 390
  }
390 391
  template<class X> struct NodePsTextsTraits : public T {
391 392
    const X &_nodePsTexts;
392 393
    NodePsTextsTraits(const T &t,const X &x) : T(t), _nodePsTexts(x) {}
393 394
  };
394 395
  ///Inserts a PostScript block to the nodes
395 396

	
396 397
  ///With this command it is possible to insert a verbatim PostScript
397 398
  ///block to the nodes.
398 399
  ///The PS current point will be moved to the center of the node before
399 400
  ///the PostScript block inserted.
400 401
  ///
401 402
  ///Before and after the block a newline character is inserted so you
402 403
  ///don't have to bother with the separators.
403 404
  ///
404 405
  ///\param x must be a node map with type that can be pushed to a standard
405 406
  ///\c ostream.
406 407
  ///
407 408
  ///\sa nodePsTextsPreamble()
408 409
  template<class X> GraphToEps<NodePsTextsTraits<X> > nodePsTexts(const X &x)
409 410
  {
410 411
    dontPrint=true;
411 412
    _showNodePsText=true;
412 413
    return GraphToEps<NodePsTextsTraits<X> >(NodePsTextsTraits<X>(*this,x));
413 414
  }
414 415
  template<class X> struct ArcWidthsTraits : public T {
415 416
    const X &_arcWidths;
416 417
    ArcWidthsTraits(const T &t,const X &x) : T(t), _arcWidths(x) {}
417 418
  };
418 419
  ///Sets the map of the arc widths
419 420

	
420 421
  ///Sets the map of the arc widths.
421 422
  ///\param x must be an arc map with \c double (or convertible) values.
422 423
  template<class X> GraphToEps<ArcWidthsTraits<X> > arcWidths(const X &x)
423 424
  {
424 425
    dontPrint=true;
425 426
    return GraphToEps<ArcWidthsTraits<X> >(ArcWidthsTraits<X>(*this,x));
426 427
  }
427 428

	
428 429
  template<class X> struct NodeColorsTraits : public T {
429 430
    const X &_nodeColors;
430 431
    NodeColorsTraits(const T &t,const X &x) : T(t), _nodeColors(x) {}
431 432
  };
432 433
  ///Sets the map of the node colors
433 434

	
434 435
  ///Sets the map of the node colors.
435 436
  ///\param x must be a node map with \ref Color values.
436 437
  ///
437 438
  ///\sa Palette
438 439
  template<class X> GraphToEps<NodeColorsTraits<X> >
439 440
  nodeColors(const X &x)
440 441
  {
441 442
    dontPrint=true;
442 443
    return GraphToEps<NodeColorsTraits<X> >(NodeColorsTraits<X>(*this,x));
443 444
  }
444 445
  template<class X> struct NodeTextColorsTraits : public T {
445 446
    const X &_nodeTextColors;
446 447
    NodeTextColorsTraits(const T &t,const X &x) : T(t), _nodeTextColors(x) {}
447 448
  };
448 449
  ///Sets the map of the node text colors
449 450

	
450 451
  ///Sets the map of the node text colors.
451 452
  ///\param x must be a node map with \ref Color values.
452 453
  ///
453 454
  ///\sa Palette
454 455
  template<class X> GraphToEps<NodeTextColorsTraits<X> >
455 456
  nodeTextColors(const X &x)
456 457
  {
457 458
    dontPrint=true;
458 459
    _nodeTextColorType=CUST_COL;
459 460
    return GraphToEps<NodeTextColorsTraits<X> >
460 461
      (NodeTextColorsTraits<X>(*this,x));
461 462
  }
462 463
  template<class X> struct ArcColorsTraits : public T {
463 464
    const X &_arcColors;
464 465
    ArcColorsTraits(const T &t,const X &x) : T(t), _arcColors(x) {}
465 466
  };
466 467
  ///Sets the map of the arc colors
467 468

	
468 469
  ///Sets the map of the arc colors.
469 470
  ///\param x must be an arc map with \ref Color values.
470 471
  ///
471 472
  ///\sa Palette
472 473
  template<class X> GraphToEps<ArcColorsTraits<X> >
473 474
  arcColors(const X &x)
474 475
  {
475 476
    dontPrint=true;
476 477
    return GraphToEps<ArcColorsTraits<X> >(ArcColorsTraits<X>(*this,x));
477 478
  }
478 479
  ///Sets a global scale factor for node sizes
479 480

	
480 481
  ///Sets a global scale factor for node sizes.
481 482
  ///
482 483
  /// If nodeSizes() is not given, this function simply sets the node
483 484
  /// sizes to \c d.  If nodeSizes() is given, but
484 485
  /// autoNodeScale() is not, then the node size given by
485 486
  /// nodeSizes() will be multiplied by the value \c d.
486 487
  /// If both nodeSizes() and autoNodeScale() are used, then the
487 488
  /// node sizes will be scaled in such a way that the greatest size will be
488 489
  /// equal to \c d.
489 490
  /// \sa nodeSizes()
490 491
  /// \sa autoNodeScale()
491 492
  GraphToEps<T> &nodeScale(double d=.01) {_nodeScale=d;return *this;}
492 493
  ///Turns on/off the automatic node size scaling.
493 494

	
494 495
  ///Turns on/off the automatic node size scaling.
495 496
  ///
496 497
  ///\sa nodeScale()
497 498
  ///
498 499
  GraphToEps<T> &autoNodeScale(bool b=true) {
499 500
    _autoNodeScale=b;return *this;
500 501
  }
501 502

	
502 503
  ///Turns on/off the absolutematic node size scaling.
503 504

	
504 505
  ///Turns on/off the absolutematic node size scaling.
505 506
  ///
506 507
  ///\sa nodeScale()
507 508
  ///
508 509
  GraphToEps<T> &absoluteNodeSizes(bool b=true) {
509 510
    _absoluteNodeSizes=b;return *this;
510 511
  }
511 512

	
512 513
  ///Negates the Y coordinates.
513 514
  GraphToEps<T> &negateY(bool b=true) {
514 515
    _negY=b;return *this;
515 516
  }
516 517

	
517 518
  ///Turn on/off pre-scaling
518 519

	
519 520
  ///By default graphToEps() rescales the whole image in order to avoid
520 521
  ///very big or very small bounding boxes.
521 522
  ///
522 523
  ///This (p)rescaling can be turned off with this function.
523 524
  ///
524 525
  GraphToEps<T> &preScale(bool b=true) {
525 526
    _preScale=b;return *this;
526 527
  }
527 528

	
528 529
  ///Sets a global scale factor for arc widths
529 530

	
530 531
  /// Sets a global scale factor for arc widths.
531 532
  ///
532 533
  /// If arcWidths() is not given, this function simply sets the arc
533 534
  /// widths to \c d.  If arcWidths() is given, but
534 535
  /// autoArcWidthScale() is not, then the arc withs given by
535 536
  /// arcWidths() will be multiplied by the value \c d.
536 537
  /// If both arcWidths() and autoArcWidthScale() are used, then the
537 538
  /// arc withs will be scaled in such a way that the greatest width will be
538 539
  /// equal to \c d.
539 540
  GraphToEps<T> &arcWidthScale(double d=.003) {_arcWidthScale=d;return *this;}
540 541
  ///Turns on/off the automatic arc width scaling.
541 542

	
542 543
  ///Turns on/off the automatic arc width scaling.
543 544
  ///
544 545
  ///\sa arcWidthScale()
545 546
  ///
546 547
  GraphToEps<T> &autoArcWidthScale(bool b=true) {
547 548
    _autoArcWidthScale=b;return *this;
548 549
  }
549 550
  ///Turns on/off the absolutematic arc width scaling.
550 551

	
551 552
  ///Turns on/off the absolutematic arc width scaling.
552 553
  ///
553 554
  ///\sa arcWidthScale()
554 555
  ///
555 556
  GraphToEps<T> &absoluteArcWidths(bool b=true) {
556 557
    _absoluteArcWidths=b;return *this;
557 558
  }
558 559
  ///Sets a global scale factor for the whole picture
559 560
  GraphToEps<T> &scale(double d) {_scale=d;return *this;}
560 561
  ///Sets the width of the border around the picture
561 562
  GraphToEps<T> &border(double b=10) {_xBorder=_yBorder=b;return *this;}
562 563
  ///Sets the width of the border around the picture
563 564
  GraphToEps<T> &border(double x, double y) {
564 565
    _xBorder=x;_yBorder=y;return *this;
565 566
  }
566 567
  ///Sets whether to draw arrows
567 568
  GraphToEps<T> &drawArrows(bool b=true) {_drawArrows=b;return *this;}
568 569
  ///Sets the length of the arrowheads
569 570
  GraphToEps<T> &arrowLength(double d=1.0) {_arrowLength*=d;return *this;}
570 571
  ///Sets the width of the arrowheads
571 572
  GraphToEps<T> &arrowWidth(double d=.3) {_arrowWidth*=d;return *this;}
572 573

	
573 574
  ///Scales the drawing to fit to A4 page
574 575
  GraphToEps<T> &scaleToA4() {_scaleToA4=true;return *this;}
575 576

	
576 577
  ///Enables parallel arcs
577 578
  GraphToEps<T> &enableParallel(bool b=true) {_enableParallel=b;return *this;}
578 579

	
579 580
  ///Sets the distance between parallel arcs
580 581
  GraphToEps<T> &parArcDist(double d) {_parArcDist*=d;return *this;}
581 582

	
582 583
  ///Hides the arcs
583 584
  GraphToEps<T> &hideArcs(bool b=true) {_showArcs=!b;return *this;}
584 585
  ///Hides the nodes
585 586
  GraphToEps<T> &hideNodes(bool b=true) {_showNodes=!b;return *this;}
586 587

	
587 588
  ///Sets the size of the node texts
588 589
  GraphToEps<T> &nodeTextSize(double d) {_nodeTextSize=d;return *this;}
589 590

	
590 591
  ///Sets the color of the node texts to be different from the node color
591 592

	
592 593
  ///Sets the color of the node texts to be as different from the node color
593 594
  ///as it is possible.
594 595
  GraphToEps<T> &distantColorNodeTexts()
595 596
  {_nodeTextColorType=DIST_COL;return *this;}
596 597
  ///Sets the color of the node texts to be black or white and always visible.
597 598

	
598 599
  ///Sets the color of the node texts to be black or white according to
599 600
  ///which is more different from the node color.
600 601
  GraphToEps<T> &distantBWNodeTexts()
601 602
  {_nodeTextColorType=DIST_BW;return *this;}
602 603

	
603 604
  ///Gives a preamble block for node Postscript block.
604 605

	
605 606
  ///Gives a preamble block for node Postscript block.
606 607
  ///
607 608
  ///\sa nodePsTexts()
608 609
  GraphToEps<T> & nodePsTextsPreamble(const char *str) {
609 610
    _nodePsTextsPreamble=str ;return *this;
610 611
  }
611 612
  ///Sets whether the graph is undirected
612 613

	
613 614
  ///Sets whether the graph is undirected.
614 615
  ///
615 616
  ///This setting is the default for undirected graphs.
616 617
  ///
617 618
  ///\sa directed()
618 619
   GraphToEps<T> &undirected(bool b=true) {_undirected=b;return *this;}
619 620

	
620 621
  ///Sets whether the graph is directed
621 622

	
622 623
  ///Sets whether the graph is directed.
623 624
  ///Use it to show the edges as a pair of directed ones.
624 625
  ///
625 626
  ///This setting is the default for digraphs.
626 627
  ///
627 628
  ///\sa undirected()
628 629
  GraphToEps<T> &directed(bool b=true) {_undirected=!b;return *this;}
629 630

	
630 631
  ///Sets the title.
631 632

	
632 633
  ///Sets the title of the generated image,
633 634
  ///namely it inserts a <tt>%%Title:</tt> DSC field to the header of
634 635
  ///the EPS file.
635 636
  GraphToEps<T> &title(const std::string &t) {_title=t;return *this;}
636 637
  ///Sets the copyright statement.
637 638

	
638 639
  ///Sets the copyright statement of the generated image,
639 640
  ///namely it inserts a <tt>%%Copyright:</tt> DSC field to the header of
640 641
  ///the EPS file.
641 642
  GraphToEps<T> &copyright(const std::string &t) {_copyright=t;return *this;}
642 643

	
643 644
protected:
644 645
  bool isInsideNode(dim2::Point<double> p, double r,int t)
645 646
  {
646 647
    switch(t) {
647 648
    case CIRCLE:
648 649
    case MALE:
649 650
    case FEMALE:
650 651
      return p.normSquare()<=r*r;
651 652
    case SQUARE:
652 653
      return p.x<=r&&p.x>=-r&&p.y<=r&&p.y>=-r;
653 654
    case DIAMOND:
654 655
      return p.x+p.y<=r && p.x-p.y<=r && -p.x+p.y<=r && -p.x-p.y<=r;
655 656
    }
656 657
    return false;
657 658
  }
658 659

	
659 660
public:
660 661
  ~GraphToEps() { }
661 662

	
662 663
  ///Draws the graph.
663 664

	
664 665
  ///Like other functions using
665 666
  ///\ref named-templ-func-param "named template parameters",
666 667
  ///this function calls the algorithm itself, i.e. in this case
667 668
  ///it draws the graph.
668 669
  void run() {
669 670
    const double EPSILON=1e-9;
670 671
    if(dontPrint) return;
671 672

	
672 673
    _graph_to_eps_bits::_NegY<typename T::CoordsMapType>
673 674
      mycoords(_coords,_negY);
674 675

	
675 676
    os << "%!PS-Adobe-2.0 EPSF-2.0\n";
676 677
    if(_title.size()>0) os << "%%Title: " << _title << '\n';
677 678
     if(_copyright.size()>0) os << "%%Copyright: " << _copyright << '\n';
678 679
    os << "%%Creator: LEMON, graphToEps()\n";
679 680

	
680 681
    {
681 682
#ifndef WIN32
682 683
      timeval tv;
683 684
      gettimeofday(&tv, 0);
684 685

	
685 686
      char cbuf[26];
686 687
      ctime_r(&tv.tv_sec,cbuf);
687 688
      os << "%%CreationDate: " << cbuf;
688 689
#else
689 690
      SYSTEMTIME time;
690 691
      char buf1[11], buf2[9], buf3[5];
691 692

	
692 693
      GetSystemTime(&time);
693 694
      if (GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
694 695
                        "ddd MMM dd", buf1, 11) &&
695 696
          GetTimeFormat(LOCALE_USER_DEFAULT, 0, &time,
696 697
                        "HH':'mm':'ss", buf2, 9) &&
697 698
          GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
698 699
                                "yyyy", buf3, 5)) {
699 700
        os << "%%CreationDate: " << buf1 << ' '
700 701
           << buf2 << ' ' << buf3 << std::endl;
701 702
      }
702 703
#endif
703 704
    }
704 705

	
705 706
    if (_autoArcWidthScale) {
706 707
      double max_w=0;
707 708
      for(ArcIt e(g);e!=INVALID;++e)
708 709
        max_w=std::max(double(_arcWidths[e]),max_w);
709 710
      if(max_w>EPSILON) {
710 711
        _arcWidthScale/=max_w;
711 712
      }
712 713
    }
713 714

	
714 715
    if (_autoNodeScale) {
715 716
      double max_s=0;
716 717
      for(NodeIt n(g);n!=INVALID;++n)
717 718
        max_s=std::max(double(_nodeSizes[n]),max_s);
718 719
      if(max_s>EPSILON) {
719 720
        _nodeScale/=max_s;
720 721
      }
721 722
    }
722 723

	
723 724
    double diag_len = 1;
724 725
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
725 726
      dim2::Box<double> bb;
726 727
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
727 728
      if (bb.empty()) {
728 729
        bb = dim2::Box<double>(dim2::Point<double>(0,0));
729 730
      }
730 731
      diag_len = std::sqrt((bb.bottomLeft()-bb.topRight()).normSquare());
731 732
      if(diag_len<EPSILON) diag_len = 1;
732 733
      if(!_absoluteNodeSizes) _nodeScale*=diag_len;
733 734
      if(!_absoluteArcWidths) _arcWidthScale*=diag_len;
734 735
    }
735 736

	
736 737
    dim2::Box<double> bb;
737 738
    for(NodeIt n(g);n!=INVALID;++n) {
738 739
      double ns=_nodeSizes[n]*_nodeScale;
739 740
      dim2::Point<double> p(ns,ns);
740 741
      switch(_nodeShapes[n]) {
741 742
      case CIRCLE:
742 743
      case SQUARE:
743 744
      case DIAMOND:
744 745
        bb.add(p+mycoords[n]);
745 746
        bb.add(-p+mycoords[n]);
746 747
        break;
747 748
      case MALE:
748 749
        bb.add(-p+mycoords[n]);
749 750
        bb.add(dim2::Point<double>(1.5*ns,1.5*std::sqrt(3.0)*ns)+mycoords[n]);
750 751
        break;
751 752
      case FEMALE:
752 753
        bb.add(p+mycoords[n]);
753 754
        bb.add(dim2::Point<double>(-ns,-3.01*ns)+mycoords[n]);
754 755
        break;
755 756
      }
756 757
    }
757 758
    if (bb.empty()) {
758 759
      bb = dim2::Box<double>(dim2::Point<double>(0,0));
759 760
    }
760 761

	
761 762
    if(_scaleToA4)
762 763
      os <<"%%BoundingBox: 0 0 596 842\n%%DocumentPaperSizes: a4\n";
763 764
    else {
764 765
      if(_preScale) {
765 766
        //Rescale so that BoundingBox won't be neither to big nor too small.
766 767
        while(bb.height()*_scale>1000||bb.width()*_scale>1000) _scale/=10;
767 768
        while(bb.height()*_scale<100||bb.width()*_scale<100) _scale*=10;
768 769
      }
769 770

	
770 771
      os << "%%BoundingBox: "
771 772
         << int(floor(bb.left()   * _scale - _xBorder)) << ' '
772 773
         << int(floor(bb.bottom() * _scale - _yBorder)) << ' '
773 774
         << int(ceil(bb.right()  * _scale + _xBorder)) << ' '
774 775
         << int(ceil(bb.top()    * _scale + _yBorder)) << '\n';
775 776
    }
776 777

	
777 778
    os << "%%EndComments\n";
778 779

	
779 780
    //x1 y1 x2 y2 x3 y3 cr cg cb w
780 781
    os << "/lb { setlinewidth setrgbcolor newpath moveto\n"
781 782
       << "      4 2 roll 1 index 1 index curveto stroke } bind def\n";
782 783
    os << "/l { setlinewidth setrgbcolor newpath moveto lineto stroke }"
783 784
       << " bind def\n";
784 785
    //x y r
785 786
    os << "/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath }"
786 787
       << " bind def\n";
787 788
    //x y r
788 789
    os << "/sq { newpath 2 index 1 index add 2 index 2 index add moveto\n"
789 790
       << "      2 index 1 index sub 2 index 2 index add lineto\n"
790 791
       << "      2 index 1 index sub 2 index 2 index sub lineto\n"
791 792
       << "      2 index 1 index add 2 index 2 index sub lineto\n"
792 793
       << "      closepath pop pop pop} bind def\n";
793 794
    //x y r
794 795
    os << "/di { newpath 2 index 1 index add 2 index moveto\n"
795 796
       << "      2 index             2 index 2 index add lineto\n"
796 797
       << "      2 index 1 index sub 2 index             lineto\n"
797 798
       << "      2 index             2 index 2 index sub lineto\n"
798 799
       << "      closepath pop pop pop} bind def\n";
799 800
    // x y r cr cg cb
800 801
    os << "/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill\n"
801 802
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
802 803
       << "   } bind def\n";
803 804
    os << "/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill\n"
804 805
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div sq fill\n"
805 806
       << "   } bind def\n";
806 807
    os << "/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill\n"
807 808
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div di fill\n"
808 809
       << "   } bind def\n";
809 810
    os << "/nfemale { 0 0 0 setrgbcolor 3 index "
810 811
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
811 812
       << " 1.5 mul mul setlinewidth\n"
812 813
       << "  newpath 5 index 5 index moveto "
813 814
       << "5 index 5 index 5 index 3.01 mul sub\n"
814 815
       << "  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub"
815 816
       << " moveto\n"
816 817
       << "  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto "
817 818
       << "stroke\n"
818 819
       << "  5 index 5 index 5 index c fill\n"
819 820
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
820 821
       << "  } bind def\n";
821 822
    os << "/nmale {\n"
822 823
       << "  0 0 0 setrgbcolor 3 index "
823 824
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
824 825
       <<" 1.5 mul mul setlinewidth\n"
825 826
       << "  newpath 5 index 5 index moveto\n"
826 827
       << "  5 index 4 index 1 mul 1.5 mul add\n"
827 828
       << "  5 index 5 index 3 sqrt 1.5 mul mul add\n"
828 829
       << "  1 index 1 index lineto\n"
829 830
       << "  1 index 1 index 7 index sub moveto\n"
830 831
       << "  1 index 1 index lineto\n"
831 832
       << "  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub"
832 833
       << " lineto\n"
833 834
       << "  stroke\n"
834 835
       << "  5 index 5 index 5 index c fill\n"
835 836
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
836 837
       << "  } bind def\n";
837 838

	
838 839

	
839 840
    os << "/arrl " << _arrowLength << " def\n";
840 841
    os << "/arrw " << _arrowWidth << " def\n";
841 842
    // l dx_norm dy_norm
842 843
    os << "/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def\n";
843 844
    //len w dx_norm dy_norm x1 y1 cr cg cb
844 845
    os << "/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx "
845 846
       << "exch def\n"
846 847
       << "       /w exch def /len exch def\n"
847 848
      //<< "0.1 setlinewidth x1 y1 moveto dx len mul dy len mul rlineto stroke"
848 849
       << "       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto\n"
849 850
       << "       len w sub arrl sub dx dy lrl\n"
850 851
       << "       arrw dy dx neg lrl\n"
851 852
       << "       dx arrl w add mul dy w 2 div arrw add mul sub\n"
852 853
       << "       dy arrl w add mul dx w 2 div arrw add mul add rlineto\n"
853 854
       << "       dx arrl w add mul neg dy w 2 div arrw add mul sub\n"
854 855
       << "       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto\n"
855 856
       << "       arrw dy dx neg lrl\n"
856 857
       << "       len w sub arrl sub neg dx dy lrl\n"
857 858
       << "       closepath fill } bind def\n";
858 859
    os << "/cshow { 2 index 2 index moveto dup stringwidth pop\n"
859 860
       << "         neg 2 div fosi .35 mul neg rmoveto show pop pop} def\n";
860 861

	
861 862
    os << "\ngsave\n";
862 863
    if(_scaleToA4)
863 864
      if(bb.height()>bb.width()) {
864 865
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.height(),
865 866
                  (A4WIDTH-2*A4BORDER)/bb.width());
866 867
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.width())/2 + A4BORDER << ' '
867 868
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.height())/2 + A4BORDER
868 869
           << " translate\n"
869 870
           << sc << " dup scale\n"
870 871
           << -bb.left() << ' ' << -bb.bottom() << " translate\n";
871 872
      }
872 873
      else {
873 874
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.width(),
874 875
                  (A4WIDTH-2*A4BORDER)/bb.height());
875 876
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.height())/2 + A4BORDER << ' '
876 877
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.width())/2 + A4BORDER
877 878
           << " translate\n"
878 879
           << sc << " dup scale\n90 rotate\n"
879 880
           << -bb.left() << ' ' << -bb.top() << " translate\n";
880 881
        }
881 882
    else if(_scale!=1.0) os << _scale << " dup scale\n";
882 883

	
883 884
    if(_showArcs) {
884 885
      os << "%Arcs:\ngsave\n";
885 886
      if(_enableParallel) {
886 887
        std::vector<Arc> el;
887 888
        for(ArcIt e(g);e!=INVALID;++e)
888 889
          if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
889 890
             &&g.source(e)!=g.target(e))
890 891
            el.push_back(e);
891 892
        std::sort(el.begin(),el.end(),arcLess(g));
892 893

	
893 894
        typename std::vector<Arc>::iterator j;
894 895
        for(typename std::vector<Arc>::iterator i=el.begin();i!=el.end();i=j) {
895 896
          for(j=i+1;j!=el.end()&&isParallel(*i,*j);++j) ;
896 897

	
897 898
          double sw=0;
898 899
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e)
899 900
            sw+=_arcWidths[*e]*_arcWidthScale+_parArcDist;
900 901
          sw-=_parArcDist;
901 902
          sw/=-2.0;
902 903
          dim2::Point<double>
903 904
            dvec(mycoords[g.target(*i)]-mycoords[g.source(*i)]);
904 905
          double l=std::sqrt(dvec.normSquare());
905 906
          dim2::Point<double> d(dvec/std::max(l,EPSILON));
906 907
          dim2::Point<double> m;
907 908
//           m=dim2::Point<double>(mycoords[g.target(*i)]+
908 909
//                                 mycoords[g.source(*i)])/2.0;
909 910

	
910 911
//            m=dim2::Point<double>(mycoords[g.source(*i)])+
911 912
//             dvec*(double(_nodeSizes[g.source(*i)])/
912 913
//                (_nodeSizes[g.source(*i)]+_nodeSizes[g.target(*i)]));
913 914

	
914 915
          m=dim2::Point<double>(mycoords[g.source(*i)])+
915 916
            d*(l+_nodeSizes[g.source(*i)]-_nodeSizes[g.target(*i)])/2.0;
916 917

	
917 918
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e) {
918 919
            sw+=_arcWidths[*e]*_arcWidthScale/2.0;
919 920
            dim2::Point<double> mm=m+rot90(d)*sw/.75;
920 921
            if(_drawArrows) {
921 922
              int node_shape;
922 923
              dim2::Point<double> s=mycoords[g.source(*e)];
923 924
              dim2::Point<double> t=mycoords[g.target(*e)];
924 925
              double rn=_nodeSizes[g.target(*e)]*_nodeScale;
925 926
              node_shape=_nodeShapes[g.target(*e)];
926 927
              dim2::Bezier3 bez(s,mm,mm,t);
927 928
              double t1=0,t2=1;
928 929
              for(int ii=0;ii<INTERPOL_PREC;++ii)
929 930
                if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape)) t2=(t1+t2)/2;
930 931
                else t1=(t1+t2)/2;
931 932
              dim2::Point<double> apoint=bez((t1+t2)/2);
932 933
              rn = _arrowLength+_arcWidths[*e]*_arcWidthScale;
933 934
              rn*=rn;
934 935
              t2=(t1+t2)/2;t1=0;
935 936
              for(int ii=0;ii<INTERPOL_PREC;++ii)
936 937
                if((bez((t1+t2)/2)-apoint).normSquare()>rn) t1=(t1+t2)/2;
937 938
                else t2=(t1+t2)/2;
938 939
              dim2::Point<double> linend=bez((t1+t2)/2);
939 940
              bez=bez.before((t1+t2)/2);
940 941
//               rn=_nodeSizes[g.source(*e)]*_nodeScale;
941 942
//               node_shape=_nodeShapes[g.source(*e)];
942 943
//               t1=0;t2=1;
943 944
//               for(int i=0;i<INTERPOL_PREC;++i)
944 945
//                 if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape))
945 946
//                   t1=(t1+t2)/2;
946 947
//                 else t2=(t1+t2)/2;
947 948
//               bez=bez.after((t1+t2)/2);
948 949
              os << _arcWidths[*e]*_arcWidthScale << " setlinewidth "
949 950
                 << _arcColors[*e].red() << ' '
950 951
                 << _arcColors[*e].green() << ' '
951 952
                 << _arcColors[*e].blue() << " setrgbcolor newpath\n"
952 953
                 << bez.p1.x << ' ' <<  bez.p1.y << " moveto\n"
953 954
                 << bez.p2.x << ' ' << bez.p2.y << ' '
954 955
                 << bez.p3.x << ' ' << bez.p3.y << ' '
955 956
                 << bez.p4.x << ' ' << bez.p4.y << " curveto stroke\n";
956 957
              dim2::Point<double> dd(rot90(linend-apoint));
957 958
              dd*=(.5*_arcWidths[*e]*_arcWidthScale+_arrowWidth)/
958 959
                std::sqrt(dd.normSquare());
959 960
              os << "newpath " << psOut(apoint) << " moveto "
960 961
                 << psOut(linend+dd) << " lineto "
961 962
                 << psOut(linend-dd) << " lineto closepath fill\n";
962 963
            }
963 964
            else {
964 965
              os << mycoords[g.source(*e)].x << ' '
965 966
                 << mycoords[g.source(*e)].y << ' '
966 967
                 << mm.x << ' ' << mm.y << ' '
967 968
                 << mycoords[g.target(*e)].x << ' '
968 969
                 << mycoords[g.target(*e)].y << ' '
969 970
                 << _arcColors[*e].red() << ' '
970 971
                 << _arcColors[*e].green() << ' '
971 972
                 << _arcColors[*e].blue() << ' '
972 973
                 << _arcWidths[*e]*_arcWidthScale << " lb\n";
973 974
            }
974 975
            sw+=_arcWidths[*e]*_arcWidthScale/2.0+_parArcDist;
975 976
          }
976 977
        }
977 978
      }
978 979
      else for(ArcIt e(g);e!=INVALID;++e)
979 980
        if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
980 981
           &&g.source(e)!=g.target(e)) {
981 982
          if(_drawArrows) {
982 983
            dim2::Point<double> d(mycoords[g.target(e)]-mycoords[g.source(e)]);
983 984
            double rn=_nodeSizes[g.target(e)]*_nodeScale;
984 985
            int node_shape=_nodeShapes[g.target(e)];
985 986
            double t1=0,t2=1;
986 987
            for(int i=0;i<INTERPOL_PREC;++i)
987 988
              if(isInsideNode((-(t1+t2)/2)*d,rn,node_shape)) t1=(t1+t2)/2;
988 989
              else t2=(t1+t2)/2;
989 990
            double l=std::sqrt(d.normSquare());
990 991
            d/=l;
991 992

	
992 993
            os << l*(1-(t1+t2)/2) << ' '
993 994
               << _arcWidths[e]*_arcWidthScale << ' '
994 995
               << d.x << ' ' << d.y << ' '
995 996
               << mycoords[g.source(e)].x << ' '
996 997
               << mycoords[g.source(e)].y << ' '
997 998
               << _arcColors[e].red() << ' '
998 999
               << _arcColors[e].green() << ' '
999 1000
               << _arcColors[e].blue() << " arr\n";
1000 1001
          }
1001 1002
          else os << mycoords[g.source(e)].x << ' '
1002 1003
                  << mycoords[g.source(e)].y << ' '
1003 1004
                  << mycoords[g.target(e)].x << ' '
1004 1005
                  << mycoords[g.target(e)].y << ' '
1005 1006
                  << _arcColors[e].red() << ' '
1006 1007
                  << _arcColors[e].green() << ' '
1007 1008
                  << _arcColors[e].blue() << ' '
1008 1009
                  << _arcWidths[e]*_arcWidthScale << " l\n";
1009 1010
        }
1010 1011
      os << "grestore\n";
1011 1012
    }
1012 1013
    if(_showNodes) {
1013 1014
      os << "%Nodes:\ngsave\n";
1014 1015
      for(NodeIt n(g);n!=INVALID;++n) {
1015 1016
        os << mycoords[n].x << ' ' << mycoords[n].y << ' '
1016 1017
           << _nodeSizes[n]*_nodeScale << ' '
1017 1018
           << _nodeColors[n].red() << ' '
1018 1019
           << _nodeColors[n].green() << ' '
1019 1020
           << _nodeColors[n].blue() << ' ';
1020 1021
        switch(_nodeShapes[n]) {
1021 1022
        case CIRCLE:
1022 1023
          os<< "nc";break;
1023 1024
        case SQUARE:
1024 1025
          os<< "nsq";break;
1025 1026
        case DIAMOND:
1026 1027
          os<< "ndi";break;
1027 1028
        case MALE:
1028 1029
          os<< "nmale";break;
1029 1030
        case FEMALE:
1030 1031
          os<< "nfemale";break;
1031 1032
        }
1032 1033
        os<<'\n';
1033 1034
      }
1034 1035
      os << "grestore\n";
1035 1036
    }
1036 1037
    if(_showNodeText) {
1037 1038
      os << "%Node texts:\ngsave\n";
1038 1039
      os << "/fosi " << _nodeTextSize << " def\n";
1039 1040
      os << "(Helvetica) findfont fosi scalefont setfont\n";
1040 1041
      for(NodeIt n(g);n!=INVALID;++n) {
1041 1042
        switch(_nodeTextColorType) {
1042 1043
        case DIST_COL:
1043 1044
          os << psOut(distantColor(_nodeColors[n])) << " setrgbcolor\n";
1044 1045
          break;
1045 1046
        case DIST_BW:
1046 1047
          os << psOut(distantBW(_nodeColors[n])) << " setrgbcolor\n";
1047 1048
          break;
1048 1049
        case CUST_COL:
1049 1050
          os << psOut(distantColor(_nodeTextColors[n])) << " setrgbcolor\n";
1050 1051
          break;
1051 1052
        default:
1052 1053
          os << "0 0 0 setrgbcolor\n";
1053 1054
        }
1054 1055
        os << mycoords[n].x << ' ' << mycoords[n].y
1055 1056
           << " (" << _nodeTexts[n] << ") cshow\n";
1056 1057
      }
1057 1058
      os << "grestore\n";
1058 1059
    }
1059 1060
    if(_showNodePsText) {
1060 1061
      os << "%Node PS blocks:\ngsave\n";
1061 1062
      for(NodeIt n(g);n!=INVALID;++n)
1062 1063
        os << mycoords[n].x << ' ' << mycoords[n].y
1063 1064
           << " moveto\n" << _nodePsTexts[n] << "\n";
1064 1065
      os << "grestore\n";
1065 1066
    }
1066 1067

	
1067 1068
    os << "grestore\nshowpage\n";
1068 1069

	
1069 1070
    //CleanUp:
1070 1071
    if(_pleaseRemoveOsStream) {delete &os;}
1071 1072
  }
1072 1073

	
1073 1074
  ///\name Aliases
1074 1075
  ///These are just some aliases to other parameter setting functions.
1075 1076

	
1076 1077
  ///@{
1077 1078

	
1078 1079
  ///An alias for arcWidths()
1079 1080
  template<class X> GraphToEps<ArcWidthsTraits<X> > edgeWidths(const X &x)
1080 1081
  {
1081 1082
    return arcWidths(x);
1082 1083
  }
1083 1084

	
1084 1085
  ///An alias for arcColors()
1085 1086
  template<class X> GraphToEps<ArcColorsTraits<X> >
1086 1087
  edgeColors(const X &x)
1087 1088
  {
1088 1089
    return arcColors(x);
1089 1090
  }
1090 1091

	
1091 1092
  ///An alias for arcWidthScale()
1092 1093
  GraphToEps<T> &edgeWidthScale(double d) {return arcWidthScale(d);}
1093 1094

	
1094 1095
  ///An alias for autoArcWidthScale()
1095 1096
  GraphToEps<T> &autoEdgeWidthScale(bool b=true)
1096 1097
  {
1097 1098
    return autoArcWidthScale(b);
1098 1099
  }
1099 1100

	
1100 1101
  ///An alias for absoluteArcWidths()
1101 1102
  GraphToEps<T> &absoluteEdgeWidths(bool b=true)
1102 1103
  {
1103 1104
    return absoluteArcWidths(b);
1104 1105
  }
1105 1106

	
1106 1107
  ///An alias for parArcDist()
1107 1108
  GraphToEps<T> &parEdgeDist(double d) {return parArcDist(d);}
1108 1109

	
1109 1110
  ///An alias for hideArcs()
1110 1111
  GraphToEps<T> &hideEdges(bool b=true) {return hideArcs(b);}
1111 1112

	
1112 1113
  ///@}
1113 1114
};
1114 1115

	
1115 1116
template<class T>
1116 1117
const int GraphToEps<T>::INTERPOL_PREC = 20;
1117 1118
template<class T>
1118 1119
const double GraphToEps<T>::A4HEIGHT = 841.8897637795276;
1119 1120
template<class T>
1120 1121
const double GraphToEps<T>::A4WIDTH  = 595.275590551181;
1121 1122
template<class T>
1122 1123
const double GraphToEps<T>::A4BORDER = 15;
1123 1124

	
1124 1125

	
1125 1126
///Generates an EPS file from a graph
1126 1127

	
1127 1128
///\ingroup eps_io
1128 1129
///Generates an EPS file from a graph.
1129 1130
///\param g Reference to the graph to be printed.
1130 1131
///\param os Reference to the output stream.
1131 1132
///By default it is <tt>std::cout</tt>.
1132 1133
///
1133 1134
///This function also has a lot of
1134 1135
///\ref named-templ-func-param "named parameters",
1135 1136
///they are declared as the members of class \ref GraphToEps. The following
1136 1137
///example shows how to use these parameters.
1137 1138
///\code
1138 1139
/// graphToEps(g,os).scale(10).coords(coords)
1139 1140
///              .nodeScale(2).nodeSizes(sizes)
1140 1141
///              .arcWidthScale(.4).run();
1141 1142
///\endcode
1142 1143
///
1143 1144
///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.
1144 1145
///
1145 1146
///\warning Don't forget to put the \ref GraphToEps::run() "run()"
1146 1147
///to the end of the parameter list.
1147 1148
///\sa GraphToEps
1148 1149
///\sa graphToEps(G &g, const char *file_name)
1149 1150
template<class G>
1150 1151
GraphToEps<DefaultGraphToEpsTraits<G> >
1151 1152
graphToEps(G &g, std::ostream& os=std::cout)
1152 1153
{
1153 1154
  return
1154 1155
    GraphToEps<DefaultGraphToEpsTraits<G> >(DefaultGraphToEpsTraits<G>(g,os));
1155 1156
}
1156 1157

	
1157 1158
///Generates an EPS file from a graph
1158 1159

	
1159 1160
///\ingroup eps_io
1160 1161
///This function does the same as
1161 1162
///\ref graphToEps(G &g,std::ostream& os)
1162 1163
///but it writes its output into the file \c file_name
1163 1164
///instead of a stream.
1164 1165
///\sa graphToEps(G &g, std::ostream& os)
1165 1166
template<class G>
1166 1167
GraphToEps<DefaultGraphToEpsTraits<G> >
1167 1168
graphToEps(G &g,const char *file_name)
1168 1169
{
1170
  std::ostream* os = new std::ofstream(file_name);
1171
  if (!(*os)) {
1172
    delete os;
1173
    throw IoError("Cannot write file", file_name);
1174
  }
1169 1175
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1170
    (DefaultGraphToEpsTraits<G>(g,*new std::ofstream(file_name),true));
1176
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1171 1177
}
1172 1178

	
1173 1179
///Generates an EPS file from a graph
1174 1180

	
1175 1181
///\ingroup eps_io
1176 1182
///This function does the same as
1177 1183
///\ref graphToEps(G &g,std::ostream& os)
1178 1184
///but it writes its output into the file \c file_name
1179 1185
///instead of a stream.
1180 1186
///\sa graphToEps(G &g, std::ostream& os)
1181 1187
template<class G>
1182 1188
GraphToEps<DefaultGraphToEpsTraits<G> >
1183 1189
graphToEps(G &g,const std::string& file_name)
1184 1190
{
1191
  std::ostream* os = new std::ofstream(file_name.c_str());
1192
  if (!(*os)) {
1193
    delete os;
1194
    throw IoError("Cannot write file", file_name);
1195
  }
1185 1196
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1186
    (DefaultGraphToEpsTraits<G>(g,*new std::ofstream(file_name.c_str()),true));
1197
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1187 1198
}
1188 1199

	
1189 1200
} //END OF NAMESPACE LEMON
1190 1201

	
1191 1202
#endif // LEMON_GRAPH_TO_EPS_H

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)