Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 29.01.2017
Сообщений: 8
1

Алгоритм нахождения максимального потока. Где исправить что бы заработало?

09.01.2018, 21:29. Показов 1112. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код с ошибками. Что нужно исправить что бы заработало?! Help me please!
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include <iostream.h>
#include <stdlib.h>  //Для функции abs().
#define TRUE 1
#define FALSE 0
#define MaxNodes 5   //Количество вершин.
#define MaxInt 1000  //Машинный эквивалент бесконечности.
 
 
//Описание типа узла.
struct Uzel
{
  int Element; //Заданный номер вершины.
  int Propusk; //Пропускная способность.
  int Metka;   //Помечена вершина или нет.
};
 
 
class Spisok
{
  private:
      int C[MaxNodes][MaxNodes];    //Матрица начальных пропускных способностей.
      int c[MaxNodes][MaxNodes];    //Матрица конечных пропускных способностей.
      int Put[MaxNodes][MaxNodes];  //Матрица сквозных путей.
      int Potok [MaxNodes];         //Потоки.
      int Est (Uzel*,int,int);
      int Tpk (int*,int,int);
  public:
      void Vvod_Ves();
      int Reshenie ();
      void Vyvod(int);
 
};
 
void main()
{
  Spisok A;
 
  A.Vvod_Ves();
  A.Vyvod(A.Reshenie());
}
 
void Spisok::Vvod_Ves()
//Ввод матрицы пропускных способностей.
{
  cout << "Вводите пропускные способности ребер:\n";
  for (int i=0;i<MaxNodes;i++)
   for (int j=0;j<MaxNodes;j++)
     {
       cout << "Введите C[" << (i+1) << "," << (j+1) << "]: "; 
       cin >> C[i][j];
       c[i][j] = C[i][j];
     }
}
 
void Spisok::Vyvod(int n)
//Вывод результатов.
{
  //Вычисление максимального объема потока.
  for (int i=0,sum=0;i<=n;sum+=Potok[i++]);
  cout << "\nМаксимальный объем потока в сети: " << sum;
  cout << "\nЗначения потоков по различным ребрам:\n";
  for (i=0;i<MaxNodes;i++)
   for (int j=i;j<MaxNodes;j++)
     if (C[i][j])
     {
         cout << "Ребро (" << (i+1) << "," << (j+1) <<"): ";
         cout << "(" << C[i][j]  << "," << C[j][i] << ")-(";
         cout << c[i][j]  << "," << c[j][i] << ")=(";
         cout << (C[i][j]-c[i][j]) << "," << (C[j][i]-c[j][i]) << ") ";
         cout << "Поток: " << abs(C[i][j]-c[i][j]) << " ";
         if (C[i][j]-c[i][j]!=0)
         {
           cout << "Направление: ";
           if (C[i][j]-c[i][j]>0)
              cout << (i+1) << "->" << (j+1);
           else
              cout << (j+1) << "->" << (i+1);
         }
         cout << endl;
     }
}
 
int Spisok::Reshenie()
{
  Uzel SS[MaxNodes]; //Множество узлов, в которые можно перейти.
  Uzel S[MaxNodes]; //Путь.
  int i,j=0,k,el,mx,mn;
  int m; //Текущее количество вершин в пути.
  int nomer=-1; //Текущее количество сквозных потоков.
  int Tupik[MaxNodes]; //Перечень "тупиковых" вершин.
  int N_Tupik; //Количество элементов в массиве.
 
  while (j!=-1)
  {
    i=m=0;
    S[i].Element=0;
    S[i].Propusk=MaxInt;
    S[i].Metka=TRUE;
    el=0;
    N_Tupik=-1;
    while (el!=MaxNodes-1)
    {
      j=-1;
      for (k=0;k<MaxNodes;k++)
       if (c[i][k]!=0) //Если есть ненулевой поток...
        if (i>0)   //и в путь уже включены вершины...
        {
          if (!Est(&S[0],m,k) && !Tpk(&Tupik[0],N_Tupik,k)) 
                            //то включаем текущую вершину,
                           //если ее нет в пути и если она не "тупиковая".
          {  
             SS[++j].Element=k;
             SS[j].Propusk=c[i][k];
             SS[j].Metka=FALSE;
          }
        }
        else 
          if (!Tpk(&Tupik[0],N_Tupik,k)) //Не вернулись ли назад?
               //Поток не нулевой, и это первая вершина.
          {    //Включаем эту вершину в путь.
               SS[++j].Element=k;
               SS[j].Propusk=c[i][k];
               SS[j].Metka=FALSE;
          }
      if (j!=-1) //Есть продолжение.
      {
         mx=SS[0].Propusk;
         el=0;
         for (k=1;k<=j;k++)
          if (SS[k].Propusk>mx)
            { el=k; mx=SS[k].Propusk; }
         S[++m].Element=SS[el].Element;
         S[m].Propusk=mx;
         S[m].Metka=TRUE;
         if (SS[el].Element==MaxNodes-1) //Найден сквозной путь.
         {
           nomer++;
           //Запоминаем сквозной путь.
           for (k=0;k<=m;k++)
              Put[nomer][k]=S[k].Element;
           //Ищем минимальный поток.
           mn=S[0].Propusk;
           el=0;
           for (k=1;k<=m;k++)
            if (S[k].Propusk<mn)
              { el=k; mn=S[k].Propusk; }
           Potok[nomer]=mn; //Запоминаем его.
           //Вычисляем остаточные пропускные способности.
           for (k=0;k<m;k++)
           { 
             c[S[k].Element][S[k+1].Element] -= Potok[nomer];
             c[S[k+1].Element][S[k].Element] += Potok[nomer];
           }
           el=MaxNodes-1; //Переход к следующей итерации.
           j=0;
         }
         else i=S[m].Element;
      }
      else //Продолжения нет. Это возможно тогда, когда:
      {
         if (i==0)  //а) все пропускные способности нулевые.
                    //   В этом случае - выход
              el=MaxNodes-1;
         else       //б) мы попали в тупик. Запомним тупиковую вершину
                    //   в массиве и отступим назад на одну вершину.
         {
           Tupik[++N_Tupik]=S[m].Element;
           m--;
           i=S[m].Element;
         }
      }
    }
  }
  return nomer; //Возвращает количество сквозных потоков.
}
 
int Spisok::Est(Uzel S[], int m, int k)
//Функция проверяет, есть ли вершина k в пути S.
//m - текущее количество элементов в пути.
//Возвращает 1, если вершина есть, и 0 - в противном случае.
{
  for (int l=0;l<=m;l++)
    if (S[l].Element==k) return 1;
  return 0;
}
 
int Spisok::Tpk(int Tupik[],int N_Tupik, int k) 
//Функция проверяет, есть ли вершина k в массиве "тупиковых" вершин.
//N_Tupik - текущее количество вершин в массиве.
//Возвращает 1, если вершина есть, и 0 - в противном случае.
{
  if (N_Tupik==-1) return 0;
  for (int l=0;l<=N_Tupik;l++)
    if (Tupik[l]==k) return 1;
  return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2018, 21:29
Ответы с готовыми решениями:

Не понимаю что нужно сделать, что бы заработало, как исправить
#include &lt;ctime&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; struct Stack {...

Нужен алгоритм нахождения минимального сечения/разреза потока
Здравствуйте! Подскажите, пожалуйста, алгоритм нахождения минимального сечения/разреза потока....

Алгоритм Форда-Фалкерсона. Нахождение максимального потока сети
В одном из городов имеется производство обуви на экспорт. Вся обувь отправляется диллерам морским...

Исправить алгоритм нахождения корней системы.
Не получается найти корни системы, помогите исправить алгоритм.

2
21 / 21 / 20
Регистрация: 05.12.2017
Сообщений: 124
09.01.2018, 22:45 2
Вот, что я изменил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...(после дефайнов и инклудов)
using namespace std; //лично у меня не определялись cout'ы без этого
....
void main()
{
setlocale(LC_ALL,"russian"); //лично у меня вместо русского иероглифы без этой команды
  Spisok A;
....
 
void Spisok::Vyvod(int n)
 
{
int sum = 0;
  for (int i=0;  i<=n; i++) //как я понял, в цикле for лучше не совать много переменных
{
  sum+=Potok[i];
  cout << "\nМаксимальный объем потока в сети: " << sum; 
}
  cout << "\nЗначения потоков по различным ребрам:\n";
  for (int i=0;i<MaxNodes;i++) // здесь i не был определен (добавил "int")
   for (int j=i;j<MaxNodes;j++)
  .....
Добавлено через 8 минут
Это еще не все(
0
21 / 21 / 20
Регистрация: 05.12.2017
Сообщений: 124
09.01.2018, 23:05 3
Далее в функции Решение ошибка: невозможно чтение памяти.

Скорее всего косяк с матрицей конечных пропускных способностей. Подозреваю, что он заполнился во Вводе, но не передался в Решение.
Еще заметил, что в начале нет цикла с int i. Действия выполняются только с нулевым элементом?
Миниатюры
Алгоритм нахождения максимального потока. Где исправить что бы заработало?  
0
09.01.2018, 23:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2018, 23:05
Помогаю со студенческими работами здесь

Составьте алгоритм и программу нахождения максимального из пятнадцати введенных пользователем чисел.
Помогите решить задачу, пришлите листинг задачи, что-бы я смог его скомпилировать или ссылку на...

С# исправить ошибку и объяснить алгоритм нахождения седловых точек
Можете подправить косяки, и объяснить как найти номер всех седловых точек массива. ЗЫ матрица А...

Алгоритм нахождения к-элементных подмножеств в множестве из n элементов. Где то ошибка!
Вот код. Программа зацикливается, буду признателен за помощь)function comb(n, k) for (i = 1 : k)...

Программа нахождения максимального элемента из (min1, ., min n), где min - минимальный в i-той строке
Дана матрица А(nxn). Написать программу нахождения максимального элемента из (min1, ..., min n),...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru