Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2012, 12:08   #1
fangb31
 
Регистрация: 29.05.2012
Сообщений: 6
По умолчанию Алгоритм поиска потока минимальной стоимости(C)

Доброго всем времени суток!Нужна помощь,требуется разработать и реализовать алгоритм поиска потока минимальной стоимости на "C".Искал информацию по данному вопросу в интернете,ничего стоящего кроме программы на "C++" мне найти не удалось.Заголовком программы является "Максимальный поток минимальной стоимости"
Код:
#include <queue>
#include <climits>
#include <iostream>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int maxnodes = 200000;

int nodes = maxnodes;
int prio[maxnodes], curflow[maxnodes], prevedge[maxnodes], prevnode[maxnodes], q[maxnodes], pot[maxnodes];
bool inqueue[maxnodes];

struct Edge {
  int to, f, cap, cost, rev;
};

vector<Edge> graph[maxnodes];

void addEdge(int s, int t, int cap, int cost){
  Edge a = {t, 0, cap, cost, graph[t].size()};
  Edge b = {s, 0, 0, -cost, graph[s].size()};
  graph[s].push_back(a);
  graph[t].push_back(b);
}

void bellmanFord(int s) {
  fill(pot, pot + nodes, INT_MAX);
  pot[s] = 0;
  int qh = 0;
  int qt = 0;
  q[qt++] = s;
  while (qh != qt) {
    int u = q[qh++];
    if (qh == nodes)
      qh = 0;
    inqueue[u] = false;
    for (int i = 0; i < (int) graph[u].size(); i++) {
      Edge &e = graph[u][i];
      int v = e.to;
      if (e.cap <= e.f) continue;
      int npot = pot[u] + e.cost;
      if (pot[v] > npot) {
        pot[v] = npot;
        if (!inqueue[v]) {
          inqueue[v] = true;
          q[qt++] = v;
          if (qt == nodes)
            qt = 0;
        }
      }
    }
  }
}

pii minCostFlow(int s, int t) {
  bellmanFord(s);
  int flow = 0;
  int flowCost = 0;
  while (true) {
    priority_queue<ll, vector<ll> , greater<ll> > q;
    q.push(s);
    fill(prio, prio + nodes, INT_MAX);
    prio[s] = 0;
    curflow[s] = INT_MAX;
    while (!q.empty()) {
      ll cur = q.top();
      int d = cur >> 32;
      int u = (int) cur;
      q.pop();
      if (d != prio[u])
        continue;
      for (int i = 0; i < (int) graph[u].size(); i++) {
        Edge &e = graph[u][i];
        int v = e.to;
        if (e.cap <= e.f) continue;
        int nprio = prio[u] + e.cost + pot[u] - pot[v];
        if (prio[v] > nprio) {
          prio[v] = nprio;
          q.push(((ll) nprio << 32) + v);
          prevnode[v] = u;
          prevedge[v] = i;
          curflow[v] = min(curflow[u], e.cap - e.f);
        }
      }    
    }
    if (prio[t] == INT_MAX)
      break;
    for (int i = 0; i < nodes; i++)
      pot[i] += prio[i];
    int df = curflow[t];
    flow += df;    
    for (int v = t; v != s; v = prevnode[v]) {
      Edge &e = graph[prevnode[v]][prevedge[v]];
      e.f += df;
      graph[v][e.rev].f -= df;
      flowCost += df * e.cost;
    }
  }
  return make_pair(flow, flowCost);
}

int main() {
  int capacity[3][3] = { { 0, 3, 2 }, { 0, 0, 2 }, { 0, 0, 0 } };
  int n = 3;
  nodes = n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (capacity[i][j] != 0) {
        addEdge(i, j, capacity[i][j], 1);
      }
    }
  }
  int s = 0;
  int t = 2;
  pii res = minCostFlow(s, t);
  int flow = res.first;
  int flowCost = res.second;
  cout << (4 == flow) << endl;
  cout << (6 == flowCost) << endl;
}
Заранее извиняюсь за глупые вопросы,в программировании я ламер.
fangb31 вне форума Ответить с цитированием
Старый 29.05.2012, 14:09   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Хотелось бы еще знать, в чем же заключаются вопросы.
mMAg вне форума Ответить с цитированием
Старый 30.05.2012, 14:42   #3
fangb31
 
Регистрация: 29.05.2012
Сообщений: 6
По умолчанию

Я имел ввиду вопросы которые могут возникнуть в ходе выполнения работы,вы мне можете чем то помочь?
fangb31 вне форума Ответить с цитированием
Старый 30.05.2012, 14:43   #4
fangb31
 
Регистрация: 29.05.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mMAg Посмотреть сообщение
Хотелось бы еще знать, в чем же заключаются вопросы.
Я имел ввиду вопросы которые могут возникнуть в ходе выполнения работы,вы мне можете чем то помочь?
fangb31 вне форума Ответить с цитированием
Старый 30.05.2012, 15:11   #5
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от fangb31 Посмотреть сообщение
Я имел ввиду вопросы которые могут возникнуть в ходе выполнения работы,вы мне можете чем то помочь?
Отлично, а теперь определитесь с вопросами, которые у вас возникли, я тогда я, может быть, чем-то и помогу.
mMAg вне форума Ответить с цитированием
Старый 30.05.2012, 15:48   #6
fangb31
 
Регистрация: 29.05.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mMAg Посмотреть сообщение
Отлично, а теперь определитесь с вопросами, которые у вас возникли, я тогда я, может быть, чем-то и помогу.
На данный момент вопрос только в том с чего начать.
fangb31 вне форума Ответить с цитированием
Старый 31.05.2012, 10:43   #7
fangb31
 
Регистрация: 29.05.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mMAg Посмотреть сообщение
Отлично, а теперь определитесь с вопросами, которые у вас возникли, я тогда я, может быть, чем-то и помогу.
Мне ждать от вас помощи?
fangb31 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
код для транспортной задачи на PascalАВС методом минимальной стоимости Настёнок Помощь студентам 0 23.12.2011 01:43
Pascal метод минимальной стоимости The_Joker Помощь студентам 2 08.10.2011 18:25
Алгоритм поиска!!!! vit1990 Помощь студентам 14 29.01.2011 21:18
Поиск минимальной стоимости GBTA Общие вопросы C/C++ 1 10.07.2010 11:17
Алгоритм нахождения, максимального потока в Графе densi2009 Общие вопросы Delphi 0 27.05.2010 23:12