1 #include <iostream> |
1 #include <iostream> |
2 #include <fstream> |
2 #include <fstream> |
3 |
3 |
4 #include <list_graph.hh> |
4 #include <list_graph.h> |
5 #include <dimacs.hh> |
5 #include <dimacs.h> |
6 #include <preflow.h> |
6 #include <preflow.h> |
7 #include <time_measure.h> |
7 #include <time_measure.h> |
8 |
8 |
9 using namespace hugo; |
9 using namespace hugo; |
10 |
10 |
11 // Use a DIMACS max flow file as stdin. |
11 // Use a DIMACS max flow file as stdin. |
12 // read_dimacs_demo < dimacs_max_flow_file |
12 // read_dimacs_demo < dimacs_max_flow_file |
13 int main(int, char **) { |
13 int main(int, char **) { |
14 typedef ListGraph::NodeIt NodeIt; |
14 typedef ListGraph::Node Node; |
15 typedef ListGraph::EachEdgeIt EachEdgeIt; |
15 typedef ListGraph::EdgeIt EdgeIt; |
16 |
16 |
17 ListGraph G; |
17 ListGraph G; |
18 NodeIt s, t; |
18 Node s, t; |
19 ListGraph::EdgeMap<int> cap(G); |
19 ListGraph::EdgeMap<int> cap(G); |
20 readDimacsMaxFlow(std::cin, G, s, t, cap); |
20 readDimacsMaxFlow(std::cin, G, s, t, cap); |
21 |
21 |
22 std::cout << "preflow demo ..." << std::endl; |
22 std::cout << "preflow demo ..." << std::endl; |
23 |
23 |
24 double mintime=1000000; |
24 double mintime=1000000; |
25 |
25 |
26 for ( int i=1; i!=11; ++i ) { |
26 for ( int i=1; i!=11; ++i ) { |
|
27 ListGraph::EdgeMap<int> flow(G); |
27 double pre_time=currTime(); |
28 double pre_time=currTime(); |
28 preflow<ListGraph, int> max_flow_test(G, s, t, cap); |
29 Preflow<ListGraph, int> max_flow_test(G, s, t, cap, flow); |
|
30 max_flow_test.run(); |
29 double post_time=currTime(); |
31 double post_time=currTime(); |
30 if ( mintime > post_time-pre_time ) mintime = post_time-pre_time; |
32 if ( mintime > post_time-pre_time ) mintime = post_time-pre_time; |
31 } |
33 } |
32 |
34 |
33 double pre_time=currTime(); |
35 ListGraph::EdgeMap<int> flow(G); |
34 preflow<ListGraph, int> max_flow_test(G, s, t, cap); |
36 Preflow<ListGraph, int> max_flow_test(G, s, t, cap, flow); |
35 double post_time=currTime(); |
37 max_flow_test.run(); |
36 |
38 |
37 ListGraph::NodeMap<bool> cut(G); |
39 ListGraph::NodeMap<bool> cut(G); |
38 max_flow_test.minCut(cut); |
40 max_flow_test.minCut(cut); |
39 int min_cut_value=0; |
41 int min_cut_value=0; |
40 for(EachEdgeIt e=G.first<EachEdgeIt>(); e.valid(); ++e) { |
42 EdgeIt e; |
|
43 for(G.first(e); G.valid(e); G.next(e)) { |
41 if (cut.get(G.tail(e)) && !cut.get(G.head(e))) min_cut_value+=cap.get(e); |
44 if (cut.get(G.tail(e)) && !cut.get(G.head(e))) min_cut_value+=cap.get(e); |
42 } |
45 } |
43 |
46 |
44 ListGraph::NodeMap<bool> cut1(G); |
47 ListGraph::NodeMap<bool> cut1(G); |
45 max_flow_test.minMinCut(cut1); |
48 max_flow_test.minMinCut(cut1); |
46 int min_min_cut_value=0; |
49 int min_min_cut_value=0; |
47 for(EachEdgeIt e=G.first<EachEdgeIt>(); e.valid(); ++e) { |
50 for(G.first(e); G.valid(e); G.next(e)) { |
48 if (cut.get(G.tail(e)) && !cut.get(G.head(e))) |
51 if (cut.get(G.tail(e)) && !cut.get(G.head(e))) |
49 min_min_cut_value+=cap.get(e); |
52 min_min_cut_value+=cap.get(e); |
50 } |
53 } |
51 |
54 |
52 ListGraph::NodeMap<bool> cut2(G); |
55 ListGraph::NodeMap<bool> cut2(G); |
53 max_flow_test.maxMinCut(cut2); |
56 max_flow_test.maxMinCut(cut2); |
54 int max_min_cut_value=0; |
57 int max_min_cut_value=0; |
55 for(EachEdgeIt e=G.first<EachEdgeIt>(); e.valid(); ++e) { |
58 for(G.first(e); G.valid(e); G.next(e)) { |
56 if (cut2.get(G.tail(e)) && !cut2.get(G.head(e))) |
59 if (cut2.get(G.tail(e)) && !cut2.get(G.head(e))) |
57 max_min_cut_value+=cap.get(e); |
60 max_min_cut_value+=cap.get(e); |
58 } |
61 } |
59 |
62 |
60 std::cout << "min time of 10 runs: " << mintime << " sec"<< std::endl; |
63 std::cout << "min time of 10 runs: " << mintime << " sec"<< std::endl; |
61 std::cout << "phase 0: " << max_flow_test.time-pre_time |
64 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
62 << " sec"<< std::endl; |
|
63 std::cout << "phase 1: " << post_time-max_flow_test.time |
|
64 << " sec"<< std::endl; |
|
65 std::cout << "flow value: "<< max_flow_test.maxFlow() << std::endl; |
|
66 std::cout << "min cut value: "<< min_cut_value << std::endl; |
65 std::cout << "min cut value: "<< min_cut_value << std::endl; |
67 std::cout << "min min cut value: "<< min_min_cut_value << std::endl; |
66 std::cout << "min min cut value: "<< min_min_cut_value << std::endl; |
68 std::cout << "max min cut value: "<< max_min_cut_value << |
67 std::cout << "max min cut value: "<< max_min_cut_value << |
69 std::endl<< std::endl; |
68 std::endl<< std::endl; |
70 |
69 |