Pagini recente » Cod sursa (job #2874743) | Cod sursa (job #3190995) | Cod sursa (job #2953847) | Cod sursa (job #1077731) | Cod sursa (job #362843)
Cod sursa(job #362843)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define N 1000
#define INFINIT 1 << 30
queue<int> q; //pentru Breadth-First
int n, m;
int a[N + 1][N + 1];
int c[N + 1][N + 1];
int f[N + 1][N + 1];
int pred[N + 1];
int viz[N + 1];
int flux;
inline int min(int a, int b)
{
if(a < b) return a;
return b;
}
void citeste()
{
ifstream fi("maxflow.in");
fi >> n >> m;
int x, y, cxy;
for(int i = 1; i <= m; ++i)
{
fi >> x >> y >> cxy;
if(c[x][y] == 0)
{
a[x][ ++a[x][0] ] = y;
a[y][ ++a[y][0] ] = x;
}
c[x][y] += cxy;
}
fi.close();
}
void scrie()
{
ofstream fo("maxflow.out");
fo << flux << "\n";
fo.close();
}
int BF()
{
int i, v, e;
memset(viz, 0, sizeof(viz));
memset(pred, 0, sizeof(pred));
q.push(1);
viz[1] = 1;
while(q.size() > 0)
{
e = q.front();
q.pop();
for(i = 1; i <= a[e][0]; ++i)
{
v = a[e][i];
if(viz[v] || c[e][v] - f[e][v] == 0) continue;
viz[v] = 1;
pred[v] = e;
if(v == n) continue;
q.push(v);
}
}
return viz[n];
}
void ford_fulkerson()
{
int inc, i, u, nod;
flux = 0;
while(BF()) //inseamna ca pot mari fluxul
{
for(i = 1; i <= a[n][0]; ++i)
{
nod = a[n][i];
if((!viz[nod]) || (c[nod][n] == f[nod][n])) continue;
pred[n] = nod;
inc = INFINIT;
for(u = n; pred[u] > 0; u = pred[u]) inc = min(inc, c[pred[u]][u] - f[pred[u]][u]);
for(u = n; pred[u] > 0; u = pred[u])
{
f[pred[u]][u] += inc;
f[u][pred[u]] -= inc;
}
flux += inc;
}
}
}
int main()
{
citeste();
ford_fulkerson();
scrie();
return 0;
}