Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для c++\noob
-2 / 2 / 1
Регистрация: 13.11.2010
Сообщений: 52

Максимальный поток минимальной стоимости

19.12.2012, 10:26. Показов 3449. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно реализовать алгоритм нахождения максимального потока минимальной стоимости в сети.Нашёл в интернете код программы, но не могу разобраться в нём насчёт переменных..Может кто-нибудь поможет с этим или у кого-то завалялась подобная программка. Буду очень признателен!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <queue>
#include <vector>
#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, int dist[]) {
  fill(dist, dist + nodes, INT_MAX);
  dist[s] = 0;
  int qt = 0;
  q[qt++] = s;
  for (int qh = 0; (qh - qt) % nodes != 0; qh++) {
    int u = q[qh % nodes];
    inqueue[u] = false;
    for (int i = 0; i < (int) graph[u].size(); i++) {
      Edge &e = graph[u][i];
      if (e.cap <= e.f) continue;
      int v = e.to;
      int ndist = dist[u] + e.cost;
      if (dist[v] > ndist) {
        dist[v] = ndist;
        if (!inqueue[v]) {
          inqueue[v] = true;
          q[qt++ % nodes] = v;
        }
      }
    }
  }
}
 
pii minCostFlow(int s, int t, int maxf) {
// bellmanFord can be safely commented if edges costs are non-negative
  bellmanFord(s, pot);
  int flow = 0;
  int flowCost = 0;
  while (flow < maxf) {
    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 = 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 = min(curflow[t], maxf - flow);
    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);
}
 
// Usage example
 
int main() {
  int capacity[3][3] = {
    { 0, 3, 2},
    { 0, 0, 2},
    { 0, 0, 0}
  };
  nodes = 3;
  for (int i = 0; i < nodes; i++)
    for (int j = 0; j < nodes; 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_MAX);
  int flow = res.first;
  int flowCost = res.second;
  cout << (4 == flow) << endl;
  cout << (6 == flowCost) << endl;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2012, 10:26
Ответы с готовыми решениями:

Максимальный поток минимальной стоимости
Вечер добрый, нашел программу работает, выдает как я понял максимальный поток и минимальную стоимость. Вопрос в следующем, как там матрица...

Поток минимальной стоимости
Дискретка : графы . Задача: существуют два города A и B , города соединены между собой сетью дорог проходящих так же через города...

Графы. Найти систему нефтепроводов минимальной суммарной стоимости
Подскажите с чего вообще начать? Нужно решить с помощью графа.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2012, 10:26
Помогаю со студенческими работами здесь

Помогите доделать программу определения минимальной стоимости билета.
Определить минимальную стоимость билета для пассажира, следующего на заданное расстояние, стоимость билета с учетом выбранного вида...

В двумерном массиве n*m найти строку с минимальной суммой и в ней максимальный элемент
1)Создать двумерный массив размером n*m. 2)Найти строку с минимальной суммой и в ней максимальный элемент. как сделать первое примерно...

Максимальный поток в графе, объясните идиоту
const int inf = 1000*1000*1000; typedef vector&lt;int&gt; graf_line; typedef vector&lt;graf_line&gt; graf; typedef vector&lt;int&gt; vint; ...

Поток минимальной стоимости в Маткаде
День добрый уважаемые коллеги. Есть готовая написанная программа для нахождения потока минимальной стоимости(транспортная задача). Но есть...

Нахождение пути минимальной стоимости?
Задача такая, есть матрица размером m на n. Необходимо из нижнего левого угла попасть в верхний правый с минимальным количеством шагов....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru