Pagini recente » Borderou de evaluare (job #546574) | Cod sursa (job #2279465)
#include <iostream>
#define N 1000
using namespace std;
int capacity[N][N]; // maximalis kapacitasok adott [i][j] ut kozott
int flow[N][N]; // aktualis folyam adott [i][j] kozott
int resi[N][N];
int nodeCount; // csomopontok szama
int edgeCount; // elek szama
void init() {
nodeCount = edgeCount = 0;
for (int i = 0; i < nodeCount; ++i) {
for (int j = 0; j < nodeCount; ++j) {
capacity[i][j] = flow[i][j] = 0;
}
}
}
int endNode = 3;
void beolvas() {
freopen("maxflow.in", "rt", stdin);
cin >> nodeCount >> edgeCount;
endNode = nodeCount-1;
int x, y, c;
for (int i = 0; i < edgeCount; ++i) {
cin >> x >> y >> c; // x csomopontbol van ut y-ba, c kapacitassal
x--;
y--;
capacity[x][y] = c;
}
}
void kiirJelenlegiFolyam() {
return;
for (int i = 0; i < nodeCount; ++i) {
for (int j = 0; j < nodeCount; ++j) {
cout << flow[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
}
#define numBit(a) (1<<a)
#define min(a,b) (a<b?a:b)
int stack[N];
int stackCounter;
int maxStack;
bool inStack(int n)
{
for (int i = 0; i < stackCounter; i++)
if (n == stack[i]) return true;
return false;
}
int findPath(int src, int minCap)
{
stack[stackCounter++] = src;
if (src == endNode)
{
maxStack = stackCounter-1;
return minCap;
}
for(int i = 0; i<nodeCount; i++)
{
if (resi[src][i] != 0 && !inStack(i))
{
//cout << "Going from " << src << " to " << i<<" at "<<stackCounter<<"\n";
int tmp = findPath(i, min(minCap, resi[src][i]));
if (tmp) return tmp;
}
}
stackCounter--;
return 0;
}
int megold() {
//TO DO
int maxFlow = 0;
while (true)
{
for (int i = 0; i < nodeCount; ++i)
for (int j = 0; j < nodeCount; ++j)
resi[i][j] = 0;
for (int i = 0; i < nodeCount; ++i) {
for (int j = 0; j < nodeCount; ++j) {
resi[i][j] += capacity[i][j]-flow[i][j];
resi[j][i] += flow[i][j];
}
}
stackCounter = 0;
int w = findPath(0, 99999);
//cout << "##" << w <<"\n";
if (w == 99999) w = 0;
if (!w) return maxFlow;
maxFlow += w;
for (int i = 0; i < maxStack; i++)
flow[stack[i]][stack[i + 1]] += w;
kiirJelenlegiFolyam();
}
}
int main()
{
init(); //Set to 0
beolvas();
int a = megold();
kiirJelenlegiFolyam();
freopen("maxflow.out", "wt", stdout);
cout << a;
return 0;
}