Форум программистов, компьютерный форум CyberForum.ru

Неправильный вывод в файл - C++

Восстановить пароль Регистрация
 
c++\noob
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
25.12.2012, 13:17     Неправильный вывод в файл #1
Поиск максимального потока минимальной стоимости. Некорректность вывода информации в файл. Быть может что-то неправильно делаю, потому прошу вашей помощи.


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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#ifndef _MAXIMUM_FLOW
#define _MAXIMUM_FLOW
 
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <fstream>
#include <algorithm>
#include <windows.h>
 
using namespace std;
 
namespace Maximum_Flow{
  static const int MAXN=1000;       // максимум вершин
  static const int MAXM=2*MAXN*MAXN;    // максимум рёбер
  static const int INF=0x3FFFFFFF; //бесконечность
  static const double INFI=1e400;
 
  // Вершины в графе должны обозначаться от 1 до n
 
  double c[MAXM],f[MAXM],w[MAXM];//пропускная способность, величина потока, цена
  int ev[MAXM],be[MAXM],next[MAXM];
  double d[MAXN],value[MAXN];
  int nbs[MAXN],pnt[MAXN],open[MAXN],mk[MAXN],oldque[MAXN];
  int num;
 
  void Initialize(){
    memset(c,0,sizeof(c));
    memset(f,0,sizeof(f));
    memset(w,0,sizeof(w));
    memset(ev,0,sizeof(ev));
    memset(be,0,sizeof(be));
    memset(next,0,sizeof(next));
    num=0;
 
    memset(d,0,sizeof(d));
    memset(value,0,sizeof(value));
    memset(nbs,0,sizeof(nbs));
    memset(pnt,0,sizeof(pnt));
    memset(open,0,sizeof(open));
    memset(mk,0,sizeof(mk));
    memset(oldque,0,sizeof(oldque));
  }
 
  void AddEdge(int u,int v,int cc){
    next[++num]=nbs[u];
    nbs[u]=num;
    be[num]=num+1;
    ev[num]=v;
    c[num]=cc;
    f[num]=0;
 
    next[++num]=nbs[v];
    nbs[v]=num;
    be[num]=num-1;
    ev[num]=u;
    c[num]=0;
    f[num]=0;
  }
 
  void AddEdge(int u,int v,int cc,int ww){
    next[++num]=nbs[u];
    nbs[u]=num;
    be[num]=num+1;
    ev[num]=v;
    c[num]=cc;
    f[num]=0;
    w[num]=ww;
 
    next[++num]=nbs[v];
    nbs[v]=num;
    be[num]=num-1;
    ev[num]=u;
    c[num]=0;
    f[num]=0;
    w[num]=-ww;
  }
 
  double MaxFlow(int n,int s,int t){
    int cur,tail,i,j,u,v;
    double flow=0;
    do{
      memset(mk,0,sizeof(mk));
      memset(d,0,sizeof(d));
      open[0]=s;
      mk[s]=1;
      d[s]=INFI;
 
      for (pnt[s]=cur=tail=0;cur<=tail && !mk[t];cur++){ 
    for (u=open[cur],j=nbs[u];j;j=next[j]){
      v=ev[j];
      if (!mk[v] && f[j]<c[j]){
        mk[v]=1;
        open[++tail]=v;
        pnt[v]=j;
        if (d[u]<c[j]-f[j]) 
          d[v]=d[u];
        else d[v]=c[j]-f[j];
      }
    }
      }
      if (!mk[t])
    break;
    
      flow+=d[t];
      for (u=t;u!=s;u=ev[be[j]]){
    j=pnt[u];
    f[j]+=d[t];
    f[be[j]]=-f[j];
      }
 
    } while (d[t]>0);
    return flow;
  }
 
  double MaxFlow(int n,int s,int t,double &cost){
    int cur,tail,tl,i,j,u,v;
    double flow;
    memset(f,0,sizeof(f));
    flow=0;
    cost=0;
 
    do{
      memset(d,0,sizeof(d));
      for (i=1;i<=n;i++) value[i]=INFI;
      open[0]=s;
      d[s]=INF;
      value[s]=0;
      tail=0;
 
      while (tail>=0){
    memset(mk,0,sizeof(mk));
    memcpy(oldque,open,sizeof(open));
 
    for (tl=tail,pnt[s]=cur=0,tail=-1;cur<=tl;cur++){
      for (u=oldque[cur],j=nbs[u];j;j=next[j]){
        v=ev[j];
        if (f[j]<c[j] && value[u]<INFI && value[u]+w[j]<value[v]){
          if (!mk[v]) {
        mk[v]=1;
        open[++tail]=v;
          }
          pnt[v]=j;
          value[v]=value[u]+w[j];
          if (d[u]<c[j]-f[j])
        d[v]=d[u];
          else 
        d[v]=c[j]-f[j];
        }
      }
    }
      }
 
      if (value[t]==INFI) 
    return flow;
 
      flow+=d[t];
      cost+=d[t]*value[t];
      for (u=t;u!=s;u=ev[be[j]]){
    j=pnt[u];
    f[j]+=d[t];
    f[be[j]]=-f[j];
      }
 
    }while (d[t]>0);
    return flow;
  }
 
  /*void Debug_Print(){
  ofstream out;
  out.open("Output.txt");
            // Для теста
    out << "****************************** Это наш граф:" << endl;
    int i;
    for (i=1;i<=num;i+=2)
      out << "У ребра" << "(" << ev[i+1] << "," << ev[i] << ")" << "пропускная способность" << c[i] << "и величина потока" << f[i] << endl;
    out << "******************************" << endl;
    out.close();
  }*/
 
  void Debug_Print_Cost(){
  ofstream out;
  out.open("Output.txt");
                    // Для теста
    out << "****************************** Это наш граф:" << endl;
    int i;
    for (i=1;i<=num;i+=2)
      out << "У ребра" << "(" << ev[i+1] << "," << ev[i] << ")" << "пропускная способность" << c[i] << "стоимость" << w[i] << "и величина потока" << f[i] << endl;
    out << "******************************" << endl;
    out.close();
  }
 
  /*void Maximum_Flow_Test(){ // Для теста
    Initialize();
    
    ifstream in;
    in.open("Input.txt");
    int nNode;
    in >> nNode;
    int edge[nNode][nNode];
    in >> edge[nNode][nNode];
    in.close();
            {0,20,10,10,0,0,0,
            0,0,0,15,10,0,0,
            0,0,0,5,0,20,0,
            0,0,0,0,25,0,25,
            0,0,0,0,0,0,15,
            0,0,0,15,0,0,25,
            0,0,0,0,0,0,0};
    
    int i,j;
    for (i=1;i<=nNode;i++)
      for (j=1;j<=nNode;j++)
    if (edge[i-1][j-1])
      AddEdge(i,j,edge[i-1][j-1]);
    MaxFlow(nNode,1,nNode);
  }*/
 
  void Maximum_Flow_Cost_Test(){ // Для теста
    Initialize();
    
    ifstream in;
    ofstream out;
    in.open("Input.txt");
    int nNode;
    in >> nNode;
    int edge[nNode][nNode];
    in >> edge[nNode][nNode];
    in.close();
         /*={0,20,10,10,0,0,0,
            0,0,0,15,10,0,0,
            0,0,0,5,0,20,0,
            0,0,0,0,25,0,25,
            0,0,0,0,0,0,15,
            0,0,0,15,0,0,25,
            0,0,0,0,0,0,0};*/
    in.open("Input2.txt");
    int cost[nNode][nNode];
    in >> cost[nNode][nNode];
    in.close();
        /*={0,100,100,125,0,0,0,
            0,0,0,40,50,0,0,
            0,0,0,100,0,150,0,
            0,0,0,0,50,0,30,
            0,0,0,0,0,0,70,
            0,0,0,70,0,0,80,
            0,0,0,0,0,0,0};*/
    
 
    int i,j;
    double c;
    for (i=1;i<=nNode;i++)
      for (j=1;j<=nNode;j++)
    if (edge[i-1][j-1])
      AddEdge(i,j,edge[i-1][j-1],cost[i-1][j-1]);
    MaxFlow(nNode,1,nNode,c);
    out.open("Output.txt");
    out << "Общая стоимость: " << c << endl;
    out.close();
  }
 
};
 
int main(){
    
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  /*Maximum_Flow::Maximum_Flow_Test();
  Maximum_Flow::Debug_Print();*/
  Maximum_Flow::Maximum_Flow_Cost_Test();
  Maximum_Flow::Debug_Print_Cost();
  system("pause");
  return 0;
  
}
 
#endif
Ввожу:
Input
"Input.txt"

7
0 20 10 10 0 0 0
0 0 0 15 10 0 0
0 0 0 5 0 20 0
0 0 0 0 25 0 25
0 0 0 0 0 0 15
0 0 0 15 0 0 25
0 0 0 0 0 0 0

"Input2.txt"

0 100 100 125 0 0 0
0 0 0 40 50 0 0
0 0 0 100 0 1 0 0
0 0 0 0 50 0 30
0 0 0 0 0 0 70
0 0 0 70 0 0 80
0 0 0 0 0 0 0


Неправильно выводит пропускную способность, стоимость и величину потока, плюс нету общей стоимости:
Output
"Output.txt"
****************************** Это наш граф:
У ребра(1,2)пропускная способность2.29332e+006стоимость436и величина потока2.29332e+006
У ребра(1,3)пропускная способность-1стоимость2.29263e+006и величина потока0
У ребра(1,5)пропускная способность-1стоимость2.29252e+006и величина потока0
У ребра(1,6)пропускная способность2.29343e+006стоимость4.45255e+006и величина потока2.29343e+006
У ребра(1,7)пропускная способность2.2928e+006стоимость8и величина потока2.2928e+006
У ребра(2,1)пропускная способность2.29279e+006стоимость436и величина потока0
У ребра(2,3)пропускная способность116стоимость116и величина потока116
У ребра(2,4)пропускная способность2.29289e+006стоимость2.29252e+006и величина потока0
У ребра(2,5)пропускная способность4.3556e+006стоимость4.38912e+006и величина потока0
У ребра(2,6)пропускная способность2.29282e+006стоимость2.29336e+006и величина потока0
У ребра(2,7)пропускная способность2.29332e+006стоимость2.29332e+006и величина потока2.29332e+006
У ребра(3,1)пропускная способность-1стоимость2.29332e+006и величина потока0
У ребра(3,3)пропускная способность-1стоимость-1и величина потока0
У ребра(3,4)пропускная способность2.29343e+006стоимость2.29343e+006и величина потока0
У ребра(3,5)пропускная способность2.2928e+006стоимость2.29257e+006и величина потока0
У ребра(3,6)пропускная способность2.29279e+006стоимость2.29257e+006и величина потока0
У ребра(3,7)пропускная способность16384стоимость2.2927e+006и величина потока16384
У ребра(4,1)пропускная способность4.20467e+006стоимость4.20467e+006и величина потока0
У ребра(4,2)пропускная способность4.44087e+006стоимость4.44087e+006и величина потока0
У ребра(4,3)пропускная способность2.29283e+006стоимость2.29261e+006и величина потока0
У ребра(4,4)пропускная способность7.65179e+007стоимость4.38941e+006и величина потока0
У ребра(4,5)пропускная способность2.29331e+006стоимость2.29248e+006и величина потока0
У ребра(4,6)пропускная способность7стоимость2.29298e+006и величина потока0
У ребра(5,2)пропускная способность-1стоимость-1и величина потока0
У ребра(5,3)пропускная способность2.29332e+006стоимость2.29332e+006и величина потока0
У ребра(5,4)пропускная способность-1стоимость-1и величина потока0
У ребра(5,5)пропускная способность1.90704e+007стоимость4.20467e+006и величина потока0
У ребра(5,6)пропускная способность2.29298e+006стоимость4.44084e+006и величина потока0
У ребра(5,7)пропускная способность2стоимость2.29262e+006и величина потока2
У ребра(6,1)пропускная способность1стоимость4.38989e+006и величина потока0
У ребра(6,2)пропускная способность4.12883e+006стоимость2.29253e+006и величина потока116
У ребра(6,3)пропускная способность2.37338e+006стоимость4.20467e+006и величина потока16268
У ребра(6,5)пропускная способность4.20467e+006стоимость2.29331e+006и величина потока2
У ребра(6,6)пропускная способность4.44159e+006стоимость2.08876e+009и величина потока0
У ребра(6,7)пропускная способность2.29287e+006стоимость2.08881e+009и величина потока2.27704e+006
У ребра(7,1)пропускная способность4.35562e+006стоимость2.29266e+006и величина потока0
У ребра(7,2)пропускная способность2.29274e+006стоимость4.40111e+006и величина потока0
У ребра(7,3)пропускная способность2.29332e+006стоимость2.29332e+006и величина потока0
У ребра(7,4)пропускная способность4.45254e+006стоимость4.45255e+006и величина потока0
У ребра(7,5)пропускная способность8стоимость8и величина потока0
У ребра(7,6)пропускная способность16384стоимость16384и величина потока0
У ребра(7,7)пропускная способность2.08876e+009стоимость2.08876e+009и величина потока0
******************************
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 13:17     Неправильный вывод в файл
Посмотрите здесь:

C++ Неправильный вывод данных из стека С++
C++ неправильный вывод кириллицы в консоль
Неправильный вывод C++
Неправильный вывод в консоли C++
C++ Неправильный вывод данных
Неправильный вывод ответа C++
C++ Неправильный вывод матрицы
Неправильный вывод C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 05:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru