1 #ifndef        NETWORK_H
#ifndef        NETWORK_H
  2 #define        NETWORK_H
#define        NETWORK_H
  3
  4 #include "map"
#include "map"
  5 #include "list"
#include "list"
  6 #include "queue"
#include "queue"
  7 #include "stack"
#include "stack"
  8 #include "algorithm"
#include "algorithm"
  9
 10 using namespace std;
using namespace std;
 11
 12 template<typename vertex, typename Compare = less<vertex> >
template<typename vertex, typename Compare = less<vertex> >
 13 class network
class network
 14

 {
{
 15 public:
public:
 16 struct vertex_weight_pair
    struct vertex_weight_pair
 17
 
     {
{
 18 vertex to;
        vertex to;
 19 double weight;
        double weight;
 20
 21 vertex_weight_pair(const vertex& x, const double& y)
        vertex_weight_pair(const vertex& x, const double& y)
 22
 
         {
{
 23 to = x;
            to = x;
 24 weight = y;
            weight = y;
 25 }
        }
 26
 27 bool operator>(const vertex_weight_pair& p)const
        bool operator>(const vertex_weight_pair& p)const
 28
 
         {
{
 29 return weight>p.weight;
            return weight>p.weight;
 30 }
        }
 31 };
    };
 32
 33 typedef typename std::list<vertex_weight_pair>                    vertex_list_class;
    typedef typename std::list<vertex_weight_pair>                    vertex_list_class;
 34 typedef typename vertex_list_class::iterator                    vertex_list_iterator;
    typedef typename vertex_list_class::iterator                    vertex_list_iterator;
 35 typedef typename std::map<vertex,vertex_list_class,Compare>        map_class;                        //
    typedef typename std::map<vertex,vertex_list_class,Compare>        map_class;                        //
 36 typedef typename map_class::iterator                            map_iterator;
    typedef typename map_class::iterator                            map_iterator;
 37
 38 protected:
protected:
 39
 40 map_class adjacency_map;                                                                        //邻接表
    map_class adjacency_map;                                                                        //邻接表
 41
 42 public:
public:
 43
 44 class iterator;
    class iterator;
 45 friend class iterator;
    friend class iterator;
 46
 47
 /**///////////////////////////////////////////////////////////////////////////
    /**///////////////////////////////////////////////////////////////////////////
 48 class iterator
    class iterator
 49
 
     {
{
 50 friend class network;
        friend class network;
 51
 52 protected:
    protected:
 53
 54 map_iterator adj_iterator;
        map_iterator adj_iterator;
 55
 56 public:
    public:
 57
 58 bool operator==(const iterator& other)
        bool operator==(const iterator& other)
 59
 
         {
{
 60 return adj_iterator == other.adj_iterator;
            return adj_iterator == other.adj_iterator;
 61 }
        }
 62
 63 bool operator!=(const iterator& other)
        bool operator!=(const iterator& other)
 64
 
         {
{
 65 return !(*this == other);
            return !(*this == other);
 66 }
        }
 67
 68 pair<vertex, list<vertex_weight_pair> >operator*()
        pair<vertex, list<vertex_weight_pair> >operator*()
 69
 
         {
{
 70 return *adj_iterator;
            return *adj_iterator;
 71 }
        }
 72
 73 iterator operator++(int)
        iterator operator++(int)
 74
 
         {
{
 75 iterator temp_itr;
            iterator temp_itr;
 76 temp_itr.adj_iterator = adj_iterator++;
            temp_itr.adj_iterator = adj_iterator++;
 77 return temp_itr;
            return temp_itr;
 78 }
        }
 79
 };/**///////////////////////////////////////////////////////////////////////////
    };/**///////////////////////////////////////////////////////////////////////////
 80
 81 struct edge_triple
    struct edge_triple
 82
 
     {
{
 83 vertex from;
        vertex from;
 84 vertex to;
        vertex to;
 85
 86 double weight;
        double weight;
 87
 88 edge_triple(const vertex& from, const vertex& to, double weight)
        edge_triple(const vertex& from, const vertex& to, double weight)
 89
 
         {
{
 90 this->from = from;
            this->from = from;
 91 this->to = to;
            this->to = to;
 92 this->weight = weight;
            this->weight = weight;
 93 }
        }
 94
 95 bool operator>(const edge_triple& other_edge_triple)const
        bool operator>(const edge_triple& other_edge_triple)const
 96
 
         {
{
 97 return weight>other_edge_triple.weight;
            return weight>other_edge_triple.weight;
 98 }
        }
 99
 };/**///////////////////////////////////////////////////////////////////////////
    };/**///////////////////////////////////////////////////////////////////////////
100
101
102 class breadth_first_iterator;
    class breadth_first_iterator;
103 friend class breadth_first_iterator;
    friend class breadth_first_iterator;
104
105
 /**///////////////////////////////////////////////////////////////////////////
    /**///////////////////////////////////////////////////////////////////////////
106 class breadth_first_iterator                        //广度优先
    class breadth_first_iterator                        //广度优先
107
 
     {
{
108 friend class network;
        friend class network;
109
110 protected:
    protected:
111
112 queue<vertex>* vertex_queue;                    //以队列存储    已访问节点
        queue<vertex>* vertex_queue;                    //以队列存储    已访问节点
113 map<vertex, bool ,Compare>* reached;            //reached 为 <vertex,bool>形式的对的映射
        map<vertex, bool ,Compare>* reached;            //reached 为 <vertex,bool>形式的对的映射
114 map_class* map_ptr;                                //指向邻接点的指针
        map_class* map_ptr;                                //指向邻接点的指针
115
116 breadth_first_iterator(const vertex& start, map_class* ptr)
        breadth_first_iterator(const vertex& start, map_class* ptr)
117
 
         {
{
118 map_ptr = ptr;
            map_ptr = ptr;
119 reached = new map<vertex, bool, Compare>();
            reached = new map<vertex, bool, Compare>();
120 vertex_queue = new queue<vertex>();
            vertex_queue = new queue<vertex>();
121
122 map_iterator itr;
            map_iterator itr;
123
 /**/////////////////////////将每个顶点标记为不可达的
            /**/////////////////////////将每个顶点标记为不可达的
124 for(itr = (*map_ptr).begin(); itr != (*map_ptr).end(); itr++)
            for(itr = (*map_ptr).begin(); itr != (*map_ptr).end(); itr++)
125
 
             {
{
126 (*reached)[(*itr).first] = false;
                (*reached)[(*itr).first] = false;
127 }
            }
128
129 (*reached)[start] = true;
            (*reached)[start] = true;
130 (*vertex_queue).push(start);
            (*vertex_queue).push(start);
131 }
        }
132
133 public:
    public:
134
135
 breadth_first_iterator()
        breadth_first_iterator() {}
{}
136
137 bool operator==(const breadth_first_iterator& other)
        bool operator==(const breadth_first_iterator& other)
138
 
         {
{
139 return (vertex_queue == other.vertex_queue)&&
            return (vertex_queue == other.vertex_queue)&&
140 (reached == other.reached)&&
                   (reached == other.reached)&&
141 (map_ptr == other.map_ptr);
                   (map_ptr == other.map_ptr);
142 }
        }
143
144 bool operator!=(const breadth_first_iterator& other)
        bool operator!=(const breadth_first_iterator& other)
145
 
         {
{
146 return !(*this == other);
            return !(*this == other);
147 }
        }
148
149 vertex operator*()
        vertex operator*()
150
 
         {
{
151 return (*vertex_queue).front();
            return (*vertex_queue).front();
152 }
        }
153
154 breadth_first_iterator operator++(int)
        breadth_first_iterator operator++(int)
155
 
         {
{
156 breadth_first_iterator temp = *this;
            breadth_first_iterator temp = *this;
157
158 vertex current = (*vertex_queue).front();
            vertex current = (*vertex_queue).front();
159 (*vertex_queue).pop();
            (*vertex_queue).pop();
160
161 map_iterator itr = (*map_ptr).find(current);
            map_iterator itr = (*map_ptr).find(current);
162 vertex_list_iterator list_itr;
            vertex_list_iterator list_itr;
163
164 for (list_itr = (*itr).second.begin();
            for (list_itr = (*itr).second.begin();
165 list_itr != (*itr).second.end(); list_itr++)
                 list_itr != (*itr).second.end(); list_itr++)
166
 
             {
{
167 vertex to = (*list_itr).to;
                vertex to = (*list_itr).to;
168
169 if ((*reached)[to] == false)
                if ((*reached)[to] == false)
170
 
                 {
{
171 (*reached)[to] = true;                                            //
                    (*reached)[to] = true;                                            //
172 (*vertex_queue).push(to);
                    (*vertex_queue).push(to);
173 }
                }
174 }
            }
175
176 if ((*vertex_queue).empty())
            if ((*vertex_queue).empty())
177
 
             {
{
178 vertex_queue = NULL;
                vertex_queue = NULL;
179 reached = NULL;
                reached = NULL;
180 map_ptr = NULL;
                map_ptr = NULL;
181 }
            }
182
183 return temp;
            return temp;
184 }
        }
185
 };/**///////////////////////////////////////////////////////////////////////////
    };/**///////////////////////////////////////////////////////////////////////////
186
187 class depth_first_iterator;
    class depth_first_iterator;
188 friend class depth_first_iterator;
    friend class depth_first_iterator;
189
190 class depth_first_iterator
    class depth_first_iterator
191
 
     {
{
192 friend class network;
        friend class network;
193
194 stack<vertex>* vertex_stack;
        stack<vertex>* vertex_stack;
195 map<vertex, bool, Compare>* reached;
        map<vertex, bool, Compare>* reached;
196 map_class* map_ptr;
        map_class* map_ptr;
197
198 depth_first_iterator(const vertex& start, map_class* ptr)
        depth_first_iterator(const vertex& start, map_class* ptr)
199
 
         {
{
200 map_ptr = ptr;                                            //
            map_ptr = ptr;                                            //
201 reached = new map<vertex, bool, Compare>();
            reached = new map<vertex, bool, Compare>();
202 vertex_stack = new stack<vertex>();
            vertex_stack = new stack<vertex>();
203
204 map_iterator itr;
            map_iterator itr;
205
206 for (itr = (*map_ptr).begin();
            for (itr = (*map_ptr).begin();
207 itr != (*map_ptr).end(); itr++)
                 itr != (*map_ptr).end(); itr++)
208
 
             {
{
209 (*reached)[(*itr).first] = false;
                (*reached)[(*itr).first] = false;
210 }
            }
211
212 (*reached)[start] = true;
            (*reached)[start] = true;
213 (*vertex_stack).push(start);
            (*vertex_stack).push(start);
214 }
        }
215
216 public:
    public:
217
 depth_first_iterator()
        depth_first_iterator() {}
{}
218
219 bool operator==(const depth_first_iterator& other)
        bool operator==(const depth_first_iterator& other)
220
 
         {
{
221 return (vertex_stack == other.vertex_stack)&&
            return (vertex_stack == other.vertex_stack)&&
222 (reached == other.reached)&&
                   (reached == other.reached)&&
223 (map_ptr == other.map_ptr);
                   (map_ptr == other.map_ptr);
224 }
        }
225
226 bool operator!=(const depth_first_iterator& other)
        bool operator!=(const depth_first_iterator& other)
227
 
         {
{
228 return !(*this == other);
            return !(*this == other);
229 }
        }
230
231 vertex operator*()
        vertex operator*()
232
 
         {
{
233 return (*vertex_stack).top();
            return (*vertex_stack).top();
234 }
        }
235
236 depth_first_iterator operator++(int)
        depth_first_iterator operator++(int)
237
 
         {
{
238 depth_first_iterator temp = *this;
            depth_first_iterator temp = *this;
239
240 vertex current = (*vertex_stack).top();
            vertex current = (*vertex_stack).top();
241 (*vertex_stack).pop();
            (*vertex_stack).pop();
242
243 map_iterator itr = (*map_ptr).find(current);
            map_iterator itr = (*map_ptr).find(current);
244 vertex_list_iterator list_itr;
            vertex_list_iterator list_itr;
245
246 for (list_itr = (*itr).second.begin();
            for (list_itr = (*itr).second.begin();
247 list_itr != (*itr).second.end(); list_itr++)
                 list_itr != (*itr).second.end(); list_itr++)
248
 
             {
{
249 vertex to = (*list_itr).to;
                vertex to = (*list_itr).to;
250
251 if ((*reached)[to] == false)
                if ((*reached)[to] == false)
252
 
                 {
{
253 (*reached)[to] = true;
                    (*reached)[to] = true;
254 (*vertex_stack).push(to);
                    (*vertex_stack).push(to);
255 }
                }
256 }
            }
257
258 if ((*vertex_stack).empty())
            if ((*vertex_stack).empty())
259
 
             {
{
260 vertex_stack = NULL;
                vertex_stack = NULL;
261 reached = NULL;
                reached = NULL;
262 map_ptr = NULL;
                map_ptr = NULL;
263 }
            }
264 return temp;
            return temp;
265 }
        }
266 };
    };
267
268
 network()
    network() {}
{}
269
270 network(const network& other)
    network(const network& other)
271
 
     {
{
272 adjacency_map = other.adjacency_map;
        adjacency_map = other.adjacency_map;
273 }
    }
274
275 unsigned int size()
    unsigned int size()
276
 
     {
{
277 return adjacency_map.size();
        return adjacency_map.size();
278 }
    }
279
280 bool empty()
    bool empty()
281
 
     {
{
282 return size() == 0;
        return size() == 0;
283 }
    }
284
285 iterator begin()
    iterator begin()
286
 
     {
{
287 iterator temp;
        iterator temp;
288
289 temp.adj_iterator = adjacency_map.begin();
        temp.adj_iterator = adjacency_map.begin();
290
291 return temp;
        return temp;
292 }
    }
293
294 iterator end()
    iterator end()
295
 
     {
{
296 iterator temp;
        iterator temp;
297
298 temp.adj_iterator = adjacency_map.end();
        temp.adj_iterator = adjacency_map.end();
299
300 return temp;
        return temp;
301 }
    }
302
303 //与边有关的实现
    //与边有关的实现
304
305 unsigned get_edge_count()
    unsigned get_edge_count()
306
 
     {
{
307 unsigned count = 0;
        unsigned count = 0;
308
309 map_iterator itr;
        map_iterator itr;
310
311 for (itr = adjacency_map.begin();
        for (itr = adjacency_map.begin();
312 itr != adjacency_map.end(); itr++)
             itr != adjacency_map.end(); itr++)
313
 
         {
{
314 count += (*itr).second.size();
            count += (*itr).second.size();
315 }
        }
316
317 return count;
        return count;
318 }
    }
319
320 double get_edge_weight(const vertex& v1, const vertex& v2)
    double get_edge_weight(const vertex& v1, const vertex& v2)
321
 
     {
{
322 map_iterator itr = adjacency_map.find(v1);
        map_iterator itr = adjacency_map.find(v1);
323
324 if (itr == adjacency_map.end() ||
        if (itr == adjacency_map.end() || 
325 adjacency_map.find(v2) == adjacency_map.end())        //v1 或 v2 不存在
            adjacency_map.find(v2) == adjacency_map.end())        //v1 或 v2 不存在
326
 
         {
{
327 return -1.0;
            return -1.0;
328 }
        }
329
330 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
331
332 for (list_itr = (*itr).second.begin();
        for (list_itr = (*itr).second.begin();
333 list_itr != (*itr).second.end(); list_itr++)
             list_itr != (*itr).second.end(); list_itr++)
334
 
         {
{
335 if ((*list_itr).to == v2)
            if ((*list_itr).to == v2)
336
 
             {
{
337 return (*list_itr).weight;
                return (*list_itr).weight;
338 }
            }
339 }
        }
340
341 return -1.0;
        return -1.0;
342 }
    }
343
344 bool contains_edge(const vertex& v1, const vertex& v2)
    bool contains_edge(const vertex& v1, const vertex& v2)
345
 
     {
{
346 map_iterator itr = adjacency_map.find(v1);
        map_iterator itr = adjacency_map.find(v1);
347
348 if (itr == adjacency_map.end() ||
        if (itr == adjacency_map.end() ||
349 adjacency_map.find(v2) == adjacency_map.end())    //v1 或 v2 不存在
            adjacency_map.find(v2) == adjacency_map.end())    //v1 或 v2 不存在
350
 
         {
{
351 return false;                                                            //
            return false;                                                            //
352 }
        }
353
354 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
355
356 for (list_itr = (*itr).second.begin();
        for (list_itr = (*itr).second.begin();
357 list_itr != (*itr).second.end(); list_itr++)
             list_itr != (*itr).second.end(); list_itr++)
358
 
         {
{
359 if ((*list_itr).to == v2)
            if ((*list_itr).to == v2)
360
 
             {
{
361 return true;
                return true;
362 }
            }
363 }
        }
364
365 return false;
        return false;
366
367 }
    }
368
369 bool insert_edge(const vertex& v1, const vertex& v2, const double& weight)
    bool insert_edge(const vertex& v1, const vertex& v2, const double& weight)
370
 
     {
{
371 if (contains_edge(v1,v2))
        if (contains_edge(v1,v2))
372
 
         {
{
373 return false;
            return false;
374 }
        }
375
376 insert_vertex(v1);
        insert_vertex(v1);
377 insert_vertex(v2);
        insert_vertex(v2);
378
379 (*(adjacency_map.find(v1))).second.push_back(vertex_weight_pair(v2,weight));
        (*(adjacency_map.find(v1))).second.push_back(vertex_weight_pair(v2,weight));
380
381 return true;
        return true;
382 }
    }
383
384 bool erase_edge(const vertex& v1, const vertex& v2)
    bool erase_edge(const vertex& v1, const vertex& v2)
385
 
     {
{
386 map_iterator itr = adjacency_map.find(v1);
        map_iterator itr = adjacency_map.find(v1);
387 if (itr == adjacency_map.end() ||
        if (itr == adjacency_map.end() || 
388 adjacency_map.find(v2) == adjacency_map.end() )
            adjacency_map.find(v2) == adjacency_map.end() )
389
 
         {
{
390 return false;
            return false;
391 }
        }
392
393 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
394
395 for (list_itr = (*itr).second.begin();
        for (list_itr = (*itr).second.begin();
396 list_itr != (*itr).second.end(); list_itr++)
             list_itr != (*itr).second.end(); list_itr++)
397
 
         {
{
398 if ((*list_itr).to == v2)
            if ((*list_itr).to == v2)
399
 
             {
{
400 (*itr).second.erase(list_itr);
                (*itr).second.erase(list_itr);
401 return true;
                return true;
402 }
            }
403 }
        }
404
405 return false;
        return false;
406 }
    }
407
408 //与点有关的实现
    //与点有关的实现
409
410 bool contains_vertex(vertex v)
    bool contains_vertex(vertex v)
411
 
     {
{
412 return adjacency_map.find(v) != adjacency_map.end();
        return adjacency_map.find(v) != adjacency_map.end();
413 }
    }
414
415 bool insert_vertex(const vertex& v)
    bool insert_vertex(const vertex& v)
416
 
     {
{
417 return adjacency_map.insert(pair<vertex,list<vertex_weight_pair> >
        return adjacency_map.insert(pair<vertex,list<vertex_weight_pair> >
418 (v,list<vertex_weight_pair>())).second;
                                     (v,list<vertex_weight_pair>())).second;
419 }
    }
420
421 bool erase_vertex(const vertex& v)
    bool erase_vertex(const vertex& v)
422
 
     {
{
423 map_iterator itr = adjacency_map.find(v);
        map_iterator itr = adjacency_map.find(v);
424
425 if (itr == adjacency_map.end())
        if (itr == adjacency_map.end())
426
 
         {
{
427 return false;
            return false;
428 }
        }
429
430 adjacency_map.erase(itr);                            //删除该节点所在list
        adjacency_map.erase(itr);                            //删除该节点所在list
431
432 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
433
434 //其他节点list中的包含该节点的节点
        //其他节点list中的包含该节点的节点
435 for (itr = adjacency_map.begin(); itr!= adjacency_map.end(); itr++)
        for (itr = adjacency_map.begin(); itr!= adjacency_map.end(); itr++)        
436
 
         {
{
437 for (list_itr = (*itr).second.begin();
            for (list_itr = (*itr).second.begin();
438 list_itr != (*itr).second.end(); list_itr++)
                 list_itr != (*itr).second.end(); list_itr++)
439
 
             {
{
440 if ((*list_itr).to == v)
                if ((*list_itr).to == v)
441
 
                 {
{
442 (*itr).second.erase(list_itr);
                    (*itr).second.erase(list_itr);
443 break;
                    break;
444 }
                }
445 }
            }
446 }
        }
447 return true;
        return true;
448 }
    }
449
450
 /**///////////////////////////////////////////////////////////////////////////遍历相关
    /**///////////////////////////////////////////////////////////////////////////遍历相关
451
452 breadth_first_iterator breadth_first_begin(const vertex& v)
    breadth_first_iterator breadth_first_begin(const vertex& v)
453
 
     {
{
454 breadth_first_iterator b_itr(v,&adjacency_map);
        breadth_first_iterator b_itr(v,&adjacency_map);
455 return b_itr;
        return b_itr;
456 }
    }
457
458 breadth_first_iterator breadth_first_end()
    breadth_first_iterator breadth_first_end()
459
 
     {
{
460 breadth_first_iterator b_itr;
        breadth_first_iterator b_itr;
461
462 b_itr.vertex_queue = NULL;
        b_itr.vertex_queue = NULL;
463 b_itr.reached = NULL;
        b_itr.reached = NULL;
464 b_itr.map_ptr = NULL;
        b_itr.map_ptr = NULL;
465 
        
466 return b_itr;
        return b_itr;
467 }
    }
468
469
470 depth_first_iterator depth_first_begin(const vertex& v)
    depth_first_iterator depth_first_begin(const vertex& v)
471
 
     {
{
472 depth_first_iterator d_itr(v,&adjacency_map);
        depth_first_iterator d_itr(v,&adjacency_map);
473 return d_itr;
        return d_itr;
474 }
    }
475
476 depth_first_iterator depth_first_end()
    depth_first_iterator depth_first_end()
477
 
     {
{
478 depth_first_iterator d_itr;
        depth_first_iterator d_itr;
479
480 d_itr.vertex_stack = NULL;
        d_itr.vertex_stack = NULL;
481 d_itr.reached = NULL;
        d_itr.reached = NULL;
482 d_itr.map_ptr = NULL;
        d_itr.map_ptr = NULL;
483
484 return d_itr;
        return d_itr;
485 }
    }
486
487
488
 /**///////////////////////////////////////////////////////////////////////////全局方法
    /**///////////////////////////////////////////////////////////////////////////全局方法
489
490 bool is_connected()                                                        //连通
    bool is_connected()                                                        //连通
491
 
     {
{
492 map_iterator itr;
        map_iterator itr;
493
494 for (itr = adjacency_map.begin(); itr != adjacency_map.end(); itr++)
        for (itr = adjacency_map.begin(); itr != adjacency_map.end(); itr++)
495
 
         {
{
496 vertex v = (*itr).first;
            vertex v = (*itr).first;
497
498 unsigned count = 0;
            unsigned count = 0;
499 breadth_first_iterator b_itr;
            breadth_first_iterator b_itr;
500
501 for (b_itr = breadth_first_begin(v); b_itr != breadth_first_end(); b_itr++)
            for (b_itr = breadth_first_begin(v); b_itr != breadth_first_end(); b_itr++)
502
 
             {
{
503 count++;
                count++;
504 }
            }
505
506 if (count < adjacency_map.size())
            if (count < adjacency_map.size())
507
 
             {
{
508 return false;
                return false;
509 }
            }
510 }
        }
511 return true;
        return true;
512 }
    }
513
514 list<vertex> get_neighbor_list(const vertex& v)                        //得到v的所有邻接点
    list<vertex> get_neighbor_list(const vertex& v)                        //得到v的所有邻接点
515
 
     {
{
516 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
517 list<vertex> vertex_list;
        list<vertex> vertex_list;
518
519 map_iterator itr = adjacency_map.find(v);
        map_iterator itr = adjacency_map.find(v);
520
521 for (list_itr = (*itr).second.begin();
        for (list_itr = (*itr).second.begin();
522 list_itr != (*itr).second.end(); list_itr++)
             list_itr != (*itr).second.end(); list_itr++)
523
 
         {
{
524 vertex_list.push_back((*list_itr).to);
            vertex_list.push_back((*list_itr).to);
525 }
        }
526
527 return vertex_list;
        return vertex_list;
528 }
    }
529
530 
    
531 network<vertex> get_minimum_spanning_tree()                            //最小生成树
    network<vertex> get_minimum_spanning_tree()                            //最小生成树
532
 
     {
{
533 network min_spanning_tree;
        network min_spanning_tree;
534
535 //优先队列    带权的边  利用向量存储 从小到大排列
        //优先队列    带权的边  利用向量存储 从小到大排列
536 priority_queue<edge_triple, vector<edge_triple>, greater<edge_triple> >pq;                        //从小到大排列
        priority_queue<edge_triple, vector<edge_triple>, greater<edge_triple> >pq;                        //从小到大排列
537
538 vertex root;
        vertex root;
539 vertex x;
        vertex x;
540 vertex y;
        vertex y;
541 vertex z;
        vertex z;
542
543 iterator itr;
        iterator itr;
544
545 list<vertex_weight_pair> adjacency_list;            //邻接        表
        list<vertex_weight_pair> adjacency_list;            //邻接        表
546 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
547
548 double weight;
        double weight;
549
550 if (empty())
        if (empty())
551
 
         {
{
552 return min_spanning_tree;
            return min_spanning_tree;
553 }
        }
554
555 itr = begin();
        itr = begin();
556 root = (*itr).first;
        root = (*itr).first;
557 min_spanning_tree.insert_vertex(root);
        min_spanning_tree.insert_vertex(root);
558
559 adjacency_list = adjacency_map[root];
        adjacency_list = adjacency_map[root];
560
561 //初始化
        //初始化
562 for (list_itr = adjacency_list.begin();
        for (list_itr = adjacency_list.begin();
563 list_itr != adjacency_list.end(); list_itr++)
             list_itr != adjacency_list.end(); list_itr++)
564
 
         {
{
565 pq.push(edge_triple(root,list_itr->to,list_itr->weight));
            pq.push(edge_triple(root,list_itr->to,list_itr->weight));
566 }
        }
567
568 while (min_spanning_tree.size()<size())
        while (min_spanning_tree.size()<size())
569
 
         {
{
570 x = pq.top().from;
            x = pq.top().from;
571 y = pq.top().to;
            y = pq.top().to;
572 weight = pq.top().weight;
            weight = pq.top().weight;
573 pq.pop();
            pq.pop();
574
575 if (!min_spanning_tree.contains_vertex(y))                                //
            if (!min_spanning_tree.contains_vertex(y))                                //
576
 
             {
{
577 min_spanning_tree.insert_vertex(y);
                min_spanning_tree.insert_vertex(y);
578 min_spanning_tree.insert_edge(x,y,weight);
                min_spanning_tree.insert_edge(x,y,weight);
579
580 adjacency_list = adjacency_map[y];
                adjacency_list = adjacency_map[y];
581
582 for (list_itr = adjacency_list.begin();
                for (list_itr = adjacency_list.begin();
583 list_itr != adjacency_list.end(); list_itr++)
                     list_itr != adjacency_list.end(); list_itr++)
584
 
                 {
{
585 z = list_itr->to;
                    z = list_itr->to;
586 if (!min_spanning_tree.contains_vertex(z))                        //
                    if (!min_spanning_tree.contains_vertex(z))                        //
587
 
                     {
{
588 weight = list_itr->weight;
                        weight = list_itr->weight;
589 pq.push(edge_triple(y,z,weight));
                        pq.push(edge_triple(y,z,weight));
590 }
                    }
591 }
                }
592 }
            }
593 }
        }
594 return min_spanning_tree;
        return min_spanning_tree;
595 }
    }
596
597
598 //单源最短路径
    //单源最短路径
599 pair<list<vertex>, double> get_shortest_path(const vertex& v1,const vertex& v2)
    pair<list<vertex>, double> get_shortest_path(const vertex& v1,const vertex& v2)
600
 
     {
{
601 const double MAX_PATH_WEIGHT = 1000000.0;
        const double MAX_PATH_WEIGHT = 1000000.0;
602
603 map<vertex,vertex,Compare> predecessor;
        map<vertex,vertex,Compare> predecessor;
604 map<vertex,double,Compare> weight_sum;
        map<vertex,double,Compare> weight_sum;
605
606 priority_queue<vertex_weight_pair,vector<vertex_weight_pair>,
        priority_queue<vertex_weight_pair,vector<vertex_weight_pair>,
607 greater<vertex_weight_pair> >pq;                                            //从小到大排列
                       greater<vertex_weight_pair> >pq;                                            //从小到大排列
608
609 //存储    从v1 到 该点的最短路径,只有当v1可达该点时才压入
        //存储    从v1 到 该点的最短路径,只有当v1可达该点时才压入
610
611 list<vertex_weight_pair> adjacency_list;
        list<vertex_weight_pair> adjacency_list;
612 vertex_list_iterator list_itr;
        vertex_list_iterator list_itr;
613
614 breadth_first_iterator b_itr;
        breadth_first_iterator b_itr;
615
616 vertex to;
        vertex to;
617 vertex from;
        vertex from;
618
619 double weight;
        double weight;
620
621 if (adjacency_map.find(v1) == adjacency_map.end() ||
        if (adjacency_map.find(v1) == adjacency_map.end() ||
622 adjacency_map.find(v2) == adjacency_map.end())                //不存在->不可达到
            adjacency_map.find(v2) == adjacency_map.end())                //不存在->不可达到
623
 
         {
{
624 return pair<list<vertex>, double> (list<vertex>(),-1.0);
            return pair<list<vertex>, double> (list<vertex>(),-1.0);
625 }
        }
626
627 bool found_v2 = false;
        bool found_v2 = false;
628
629 //利用广度优先遍历,确定v1是否可以达到v2
        //利用广度优先遍历,确定v1是否可以达到v2
630 for (b_itr = breadth_first_begin(v1); b_itr != breadth_first_end(); b_itr++)
        for (b_itr = breadth_first_begin(v1); b_itr != breadth_first_end(); b_itr++)
631
 
         {
{
632 if (*b_itr == v2)
            if (*b_itr == v2)
633
 
             {
{
634 found_v2 = true;
                found_v2 = true;
635 break;
                break;
636 }
            }
637 }
        }
638
639 if (!found_v2)
        if (!found_v2)
640
 
         {
{
641 return pair<list<vertex>, double> (list<vertex>(),-1.0);
            return pair<list<vertex>, double> (list<vertex>(),-1.0);
642 }
        }
643
644
 /**//*weight_sum[v1] = 0.0;
        /**//*weight_sum[v1] = 0.0;
645 predecessor[v1] = v1;*/
        predecessor[v1] = v1;*/
646
647 //初始化
        //初始化
648 for (b_itr = breadth_first_begin(v1);b_itr != breadth_first_end(); b_itr++)
        for (b_itr = breadth_first_begin(v1);b_itr != breadth_first_end(); b_itr++)
649
 
         {
{
650 weight_sum[*b_itr] = MAX_PATH_WEIGHT;
            weight_sum[*b_itr] = MAX_PATH_WEIGHT;
651 predecessor[*b_itr] = vertex();
            predecessor[*b_itr] = vertex();
652 }
        }
653
654 weight_sum[v1] = 0.0;
        weight_sum[v1] = 0.0;
655 predecessor[v1] = v1;
        predecessor[v1] = v1;
656
657 //根节点 的邻接点 的初始化
        //根节点 的邻接点 的初始化
658 adjacency_list = adjacency_map[v1];
        adjacency_list = adjacency_map[v1];
659 for (list_itr = adjacency_list.begin(); list_itr != adjacency_list.end(); list_itr++)
        for (list_itr = adjacency_list.begin(); list_itr != adjacency_list.end(); list_itr++)
660
 
         {
{
661 weight_sum[list_itr->to] = list_itr->weight;
            weight_sum[list_itr->to] = list_itr->weight;
662 predecessor[list_itr->to] = v1;
            predecessor[list_itr->to] = v1;
663 pq.push(vertex_weight_pair(*list_itr));
            pq.push(vertex_weight_pair(*list_itr));
664 }
        }
665
666 bool path_found = false;
        bool path_found = false;
667
668 while (!path_found)
        while (!path_found)
669
 
         {
{
670 from = pq.top().to;                                                //
            from = pq.top().to;                                                //
671 pq.pop();
            pq.pop();
672
673 if (from == v2)
            if (from == v2)
674
 
             {
{
675 path_found = true;
                path_found = true;
676 }
            }
677 else
            else
678
 
             {
{
679 adjacency_list = adjacency_map[from];
                adjacency_list = adjacency_map[from];
680 for (list_itr = adjacency_list.begin();
                for (list_itr = adjacency_list.begin();
681 list_itr != adjacency_list.end(); list_itr++)
                     list_itr != adjacency_list.end(); list_itr++)
682
 
                 {
{
683 to = list_itr->to;                                        //
                    to = list_itr->to;                                        //
684 weight = list_itr->weight;
                    weight = list_itr->weight;
685
686 if (weight_sum[from] + weight < weight_sum[to])
                    if (weight_sum[from] + weight < weight_sum[to])
687
 
                     {
{
688 weight_sum[to] = weight_sum[from] + weight;
                        weight_sum[to] = weight_sum[from] + weight;
689 predecessor[to] = from;
                        predecessor[to] = from;
690
691 pq.push(vertex_weight_pair(to,weight_sum[to]));
                        pq.push(vertex_weight_pair(to,weight_sum[to]));
692 }
                    }
693 }
                }
694 }
            }
695 }
        }
696
697 list<vertex> path;
        list<vertex> path;
698 vertex current = v2;
        vertex current = v2;
699 while(current != v1)
        while(current != v1)
700
 
         {
{
701 path.push_front(current);
            path.push_front(current);
702 current = predecessor[current];
            current = predecessor[current];
703 }
        }
704 path.push_front(v1);
        path.push_front(v1);
705
706 return pair<list<vertex>, double> (path,weight_sum[v2]);
        return pair<list<vertex>, double> (path,weight_sum[v2]);
707 }
    }
708
709 //            连通
    //            连通
710 pair<list<vertex>, double> get_cycle()                                                //环
    pair<list<vertex>, double> get_cycle()                                                //环
711
 
     {
{
712 pair<list<vertex>, double> cycle;
        pair<list<vertex>, double> cycle;
713
714 list<vertex> cycle_list;
        list<vertex> cycle_list;
715
716 double weight;
        double weight;
717 double cycle_weight = 0.0;
        double cycle_weight = 0.0;
718
719 list<vertex_weight_pair> adjacency_list;
        list<vertex_weight_pair> adjacency_list;
720 vertex_list_iterator     list_itr;
        vertex_list_iterator     list_itr;
721
722 iterator itr = begin();
        iterator itr = begin();
723
724 vertex v;
        vertex v;
725 vertex start = (*itr).first;
        vertex start = (*itr).first;
726
727 cycle_list.push_back(start);
        cycle_list.push_back(start);
728 v = start;
        v = start;
729
730 while (cycle_list.size() < size())
        while (cycle_list.size() < size())
731
 
         {
{
732 adjacency_list = adjacency_map[v];
            adjacency_list = adjacency_map[v];
733 list_itr = adjacency_list.begin();
            list_itr = adjacency_list.begin();
734 do
            do 
735
 
             {
{
736 v = list_itr->to;
                v = list_itr->to;
737 weight = list_itr->weight;
                weight = list_itr->weight;
738 list_itr++;
                list_itr++;
739 } while(find(cycle_list.begin(),cycle_list.end(),v)!=cycle_list.end()
            } while(find(cycle_list.begin(),cycle_list.end(),v)!=cycle_list.end()
740 &&list_itr != adjacency_list.end());                               //v已经存在cycle_list中
                    &&list_itr != adjacency_list.end());                               //v已经存在cycle_list中
741
742 if (find(cycle_list.begin(),cycle_list.end(),v) == cycle_list.end())
            if (find(cycle_list.begin(),cycle_list.end(),v) == cycle_list.end())
743
 
             {
{
744 cycle_list.push_back(v);
                cycle_list.push_back(v);
745 cycle_weight += weight;
                cycle_weight += weight;
746 }
            }
747 }
        }
748
749 cycle_list.push_back(start);
        cycle_list.push_back(start);
750 cycle_weight += get_edge_weight(v,start);
        cycle_weight += get_edge_weight(v,start);
751 cycle.first = cycle_list;
        cycle.first = cycle_list;
752 cycle.second = cycle_weight;
        cycle.second = cycle_weight;
753 return cycle;
        return cycle;
754 }
    }
755 };
};
756 #endif
#endif
757
758
759
760
 
	posted on 2009-12-27 15:50 
HenDanTou 阅读(555) 
评论(0)  编辑 收藏 引用  所属分类: 
数据结构