[Lemon-commits] [lemon_svn] marci: r27 - hugo/trunk/src/work

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


Author: marci
Date: Mon Jan 12 12:50:52 2004
New Revision: 27

Modified:
   hugo/trunk/src/work/marci_max_flow.hh

Log:
reimplemented max_flow algorithm class with bfs_iterator1


Modified: hugo/trunk/src/work/marci_max_flow.hh
==============================================================================
--- hugo/trunk/src/work/marci_max_flow.hh	(original)
+++ hugo/trunk/src/work/marci_max_flow.hh	Mon Jan 12 12:50:52 2004
@@ -94,40 +94,6 @@
     typedef typename res_graph_type<graph_type, T>::res_out_edge_it out_edge_iterator;
   };
 
-  template <typename graph_type, typename pred_type, typename free_type>
-  struct flow_visitor {
-    typedef typename graph_traits<graph_type>::node_iterator node_iterator;
-    typedef typename graph_traits<graph_type>::edge_iterator edge_iterator;
-    typedef typename graph_traits<graph_type>::each_node_iterator each_node_iterator;
-    typedef typename graph_traits<graph_type>::out_edge_iterator out_edge_iterator;
-    graph_type& G;
-    pred_type& pred;
-    free_type& free;
-    flow_visitor(graph_type& _G, pred_type& _pred, free_type& _free) : G(_G), pred(_pred), free(_free) { }
-    void at_previously_reached(out_edge_iterator& e) { 
-      //node_iterator v=G.tail(e);
-      //node_iterator w=G.head(e);
-      //std::cout<<G.id(v)<<"->"<<G.id(w)<<", "<<G.id(w)<<" is already reached";
-      //std::cout<<std::endl;
-   }
-    void at_newly_reached(out_edge_iterator& e) { 
-      node_iterator v=G.tail(e);
-      node_iterator w=G.head(e);
-      //std::cout<<G.id(v)<<"->"<<G.id(w)<<", "<<G.id(w)<<" is newly reached";
-      pred.put(w, e);
-      if (pred.get(v).is_valid()) {
-	free.put(w, std::min(free.get(v), e.free()));
-	//std::cout <<" nem elso csucs: ";
-	//std::cout <<"szabad kap eddig: "<< free.get(w) << " ";
-      } else {
-	free.put(w, e.free()); 
-	//std::cout <<" elso csucs: ";
-	//std::cout <<"szabad kap eddig: "<< free.get(w) << " ";
-      }
-      //std::cout<<std::endl;
-    }
-  };
-
   template <typename graph_type, typename T>
   struct max_flow_type {
     
@@ -152,55 +118,55 @@
       typedef res_graph_type<graph_type, T> aug_graph_type;
       aug_graph_type res_graph(G, flow, capacity);
 
-      typedef std::queue<graph_traits<aug_graph_type>::out_edge_iterator> bfs_queue_type;
-      bfs_queue_type bfs_queue;
-      //bfs_queue.push(res_graph.first_out_edge(s));
-
-      typedef node_property_vector<aug_graph_type, bool> reached_type;
-      //reached_type reached(res_graph, false);
-      reached_type reached(res_graph);
-      //reached.put(s, true);
-
-      typedef node_property_vector<aug_graph_type, graph_traits<aug_graph_type>::edge_iterator> pred_type;
-      pred_type pred(res_graph);
-      pred.put(s, res_graph.invalid_edge());
-      
-      typedef node_property_vector<aug_graph_type, int> free_type;
-      free_type free(res_graph);
-
-      typedef flow_visitor<aug_graph_type, pred_type, free_type> visitor_type;
-      visitor_type vis(res_graph, pred, free);
-      
-      bfs_iterator< aug_graph_type, reached_type, visitor_type > 
-	res_bfs(res_graph, bfs_queue, reached, vis);
-
-      //for(graph_traits<aug_graph_type>::each_node_iterator i=res_graph.first_node(); i.is_valid(); ++i) { 
-      //for(graph_traits<aug_graph_type>::out_edge_iterator j=res_graph.first_out_edge(i); j.is_valid(); ++j) {
-      //  std::cout<<"("<<res_graph.tail(j)<< "->"<<res_graph.head(j)<<") ";
-      //}
-      //}
-      //std::cout<<std::endl;
-
-      //char c; 
       bool augment;
       do {
 	augment=false;
-	
-	while (!bfs_queue.empty()) { bfs_queue.pop(); }
+
+	typedef std::queue<graph_traits<aug_graph_type>::out_edge_iterator> bfs_queue_type;
+	bfs_queue_type bfs_queue;
 	bfs_queue.push(res_graph.first_out_edge(s));
-	
-	for(graph_traits<aug_graph_type>::each_node_iterator i=res_graph.first_node(); i.is_valid(); ++i) { reached.put(i, false); }
+
+	typedef node_property_vector<aug_graph_type, bool> reached_type;
+	//reached_type reached(res_graph);
+	//for(graph_traits<aug_graph_type>::each_node_iterator i=res_graph.first_node(); i.is_valid(); ++i) { reached.put(i, false); }
+	reached_type reached(res_graph, false);
 	reached.put(s, true); 
 	
+	bfs_iterator1< aug_graph_type, reached_type > 
+	res_bfs(res_graph, bfs_queue, reached);
+
+	typedef node_property_vector<aug_graph_type, graph_traits<aug_graph_type>::edge_iterator> pred_type;
+	pred_type pred(res_graph);
+	pred.put(s, res_graph.invalid_edge());
+
+	typedef node_property_vector<aug_graph_type, int> free_type;
+	free_type free(res_graph);
+	
 	//searching for augmenting path
-	while ( /*std::cin>>c &&*/ res_bfs.is_valid() ) { 
-	  res_bfs.process(); 
-	  //if (res_graph.head(graph_traits<aug_graph_type>::out_edge_iterator(res_bfs))==t) break;
+	while ( res_bfs.is_valid() ) { 
+	  //std::cout<<"KULSO ciklus itt jar: "<<G.id(res_graph.tail(res_bfs))<<"->"<<G.id(res_graph.head(res_bfs))<<std::endl;
+	  if (res_bfs.is_newly_reached()) {
+	    graph_traits<aug_graph_type>::edge_iterator e;
+	    e=res_bfs;
+	    node_iterator v=res_graph.tail(e);
+	    node_iterator w=res_graph.head(e);
+	    //std::cout<<G.id(v)<<"->"<<G.id(w)<<", "<<G.id(w)<<" is newly reached";
+	    pred.put(w, e);
+	    if (pred.get(v).is_valid()) {
+	      free.put(w, std::min(free.get(v), e.free()));
+	      //std::cout <<" nem elso csucs: ";
+	      //std::cout <<"szabad kap eddig: "<< free.get(w) << " ";
+	    } else {
+	      free.put(w, e.free()); 
+	      //std::cout <<" elso csucs: ";
+	      //std::cout <<"szabad kap eddig: "<< free.get(w) << " ";
+	    }
+	    //std::cout<<std::endl;
+	  }
+	
 	  if (res_graph.head(res_bfs)==t) break;
-	  //res_bfs.next();
 	  ++res_bfs;
 	}
-	//for (; std::cin>>c && !res_bfs.finished() && res_graph.head(res_bfs.current())!=t; res_bfs.next()) { res_bfs.process(); } 
 	if (reached.get(t)) {
 	  augment=true;
 	  node_iterator n=t;
@@ -215,7 +181,7 @@
 	  std::cout<<std::endl;
 	}
 
-	std::cout << "max flow:"<< std::endl;
+	std::cout << "actual flow: "<< std::endl;
 	for(graph_traits<graph_type>::each_edge_iterator e=G.first_edge(); e.is_valid(); ++e) { 
 	  std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
 	}



More information about the Lemon-commits mailing list