2015-02-01 5 views
1

Я использую библиотеку boost, чтобы найти максимальный поток (push relabel), и есть файл read_dimacs.hpp, считывающий данные, но stdin. проблема в том, что мой файл данных слишком велик, и я хочу напрямую читать файл данных из файла. Может ли один помочь код me.The нижеКак я могу прочитать данные из файла в библиотеке boost

#include <boost/config.hpp> 
#include <iostream> 
#include <string> 
#include <boost/graph/push_relabel_max_flow.hpp> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/read_dimacs.hpp> 

int 
main() 
{ 
    using namespace boost; 

    typedef adjacency_list_traits<vecS, vecS, directedS> Traits; 
    typedef adjacency_list<vecS, vecS, directedS, 
    property<vertex_name_t, std::string>, 
    property<edge_capacity_t, long, 
     property<edge_residual_capacity_t, long, 
    property<edge_reverse_t, Traits::edge_descriptor> > > 
    > Graph; 

    Graph g; 
    long flow; 

    property_map<Graph, edge_capacity_t>::type 
    capacity = get(edge_capacity, g); 
    property_map<Graph, edge_reverse_t>::type 
    rev = get(edge_reverse, g); 
    property_map<Graph, edge_residual_capacity_t>::type 
    residual_capacity = get(edge_residual_capacity, g); 

    Traits::vertex_descriptor s, t; 
    read_dimacs_max_flow(g, capacity, rev, s, t); 

    flow = push_relabel_max_flow(g, s, t); 

    std::cout << "c The total flow:" << std::endl; 
    std::cout << "s " << flow << std::endl << std::endl; 

    std::cout << "c flow values:" << std::endl; 
    graph_traits<Graph>::vertex_iterator u_iter, u_end; 
    graph_traits<Graph>::out_edge_iterator ei, e_end; 
    for (boost::tie(u_iter, u_end) = vertices(g); u_iter != u_end; ++u_iter) 
    for (boost::tie(ei, e_end) = out_edges(*u_iter, g); ei != e_end; ++ei) 
     if (capacity[*ei] > 0) 
     std::cout << "f " << *u_iter << " " << target(*ei, g) << " " 
        << (capacity[*ei] - residual_capacity[*ei]) << std::endl; 
    system("pause"); 
    return 0; 
} 
+1

STDIN не имеет ограничения на размер. Вы можете сделать './myprog

+0

Что значит «мой файл данных слишком велик»? У вашей системы заканчивается память (бросая 'std :: bad_alloc')? Ваша программа работает так, как ожидалось, для небольших входов? Можете ли вы показать, как это происходит? – 5gon12eder

+0

мой файл данных как файл dimacs.dat как узлы и дуги более 1000 вершин, как я могу прочитать его в алгоритме? этот алгоритм считывает данные как stdin, и я хочу, чтобы алгоритм считывал данные из моего файла. –

ответ

0

Вы можете

  1. магазин основной контейнер в общей памяти/памяти отображается файл.

    Примером этого здесь: Using boost::iostreams::mapped_file_source with std::multimap

    Конечно, вы должны связать его с Boost, Graph. Если вы размещаете с SSCCE, я мог видеть, является ли это легко адаптировать

  2. вы можете распределить нагрузку с помощью Boost, Parallel библиотеку Graph

    http://www.boost.org/doc/libs/1_57_0/libs/graph_parallel/doc/html/index.html

    У меня нет опыта в этом, достаточно , чтобы узнать, имеет ли смысл использовать ваши потребности в алгоритме. (Я знаю, что вы все еще можете скомпилировать его, но это может быть неоптимальным, если алгоритм по существу работает в одном процессе, втягивая данных. Память отображаются файлы будет намного быстрее там)

+0

У меня есть данные как файл dimacs.dat, и я хочу найти максимальный поток между любыми двумя вершинами, я хочу, чтобы алгоритм push_relabel читал эти данные в моем файле, но алгоритм читал данные как stdin не из моего файла. Могу ли я сделать некоторые изменения в алгоритме, чтобы читать мои данные? –

+0

@HaederALjoburey Посмотрите: _ «Если вы публикуете в SSCCE, я мог бы понять, легко ли его адаптировать» _ – sehe

+0

спасибо, но что вы имеете в виду «SSCCE»? –