marci@368: // -*- c++ -*- marci@368: #include marci@368: #include marci@368: #include marci@368: marci@368: #include marci@368: #include marci@368: //#include marci@368: #include marci@368: #include marci@368: #include marci@368: #include marci@368: marci@368: using namespace hugo; marci@368: marci@368: int main() { marci@368: typedef UndirListGraph Graph; marci@368: typedef Graph::Node Node; marci@368: typedef Graph::NodeIt NodeIt; marci@368: typedef Graph::Edge Edge; marci@368: typedef Graph::EdgeIt EdgeIt; marci@368: typedef Graph::OutEdgeIt OutEdgeIt; marci@368: marci@368: Graph g; marci@368: //Node s, t; marci@368: //Graph::EdgeMap cap(g); marci@368: //readDimacsMaxFlow(std::cin, g, s, t, cap); marci@368: std::vector s_nodes; marci@368: std::vector t_nodes; marci@368: for (int i=0; i<3; ++i) s_nodes.push_back(g.addNode()); marci@368: for (int i=0; i<3; ++i) t_nodes.push_back(g.addNode()); marci@368: g.addEdge(s_nodes[0], t_nodes[2]); marci@368: g.addEdge(t_nodes[1], s_nodes[2]); marci@368: marci@368: Graph::NodeMap ref_map(g, -1); marci@368: IterableBoolMap< Graph::NodeMap > bipartite_map(ref_map); marci@368: for (int i=0; i<3; ++i) bipartite_map.insert(s_nodes[i], false); marci@368: for (int i=0; i<3; ++i) bipartite_map.insert(t_nodes[i], true); marci@368: typedef BipartiteGraphWrapper BGW; marci@368: BGW bgw(g, bipartite_map); marci@368: FOR_EACH_LOC(BGW::EdgeIt, e, bgw) { marci@368: std::cout << bgw.tail(e) << "->" << bgw.head(e) << std::endl; marci@368: } marci@368: // Graph::NodeMap pred(G); marci@368: // Timer ts; marci@368: // { marci@368: // ts.reset(); marci@368: // Graph::NodeMap reached(G); marci@368: // reached.set(s, true); marci@368: // pred.set(s, INVALID); marci@368: // std::queue bfs_queue; marci@368: // bfs_queue.push(t); marci@368: // while (!bfs_queue.empty()) { marci@368: // Node v=bfs_queue.front(); marci@368: // bfs_queue.pop(); marci@368: // OutEdgeIt e; marci@368: // for(G.first(e,v); G.valid(e); G.next(e)) { marci@368: // Node w=G.head(e); marci@368: // if (!reached[w]) { marci@368: // bfs_queue.push(w); marci@368: // reached.set(w, true); marci@368: // pred.set(w, e); marci@368: // } marci@368: // } marci@368: // } marci@368: marci@368: // std::cout << ts << std::endl; marci@368: // } marci@368: marci@368: // { marci@368: // ts.reset(); marci@368: // BfsIterator< Graph, Graph::NodeMap > bfs(G); marci@368: // bfs.pushAndSetReached(s); marci@368: // pred.set(s, INVALID); marci@368: // while (!bfs.finished()) { marci@368: // ++bfs; marci@368: // if (G.valid(bfs) && bfs.isBNodeNewlyReached()) marci@368: // pred.set(bfs.bNode(), bfs); marci@368: // } marci@368: // std::cout << ts << std::endl; marci@368: // } marci@368: marci@368: return 0; marci@368: }