Pagini recente » Cod sursa (job #2624282) | Cod sursa (job #1827567) | Cod sursa (job #1672031) | Cod sursa (job #2725009) | Cod sursa (job #1891824)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define MAXN 1001
#define MAX (1<<31)-1
using namespace std;
int n, m, s, d, flux;
int used[MAXN];
int tata[MAXN];
int C[MAXN][MAXN];
vector<int> G[MAXN];
queue<int> Q;
inline void add(int x, int y, int z)
{
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = z;
}
void read(void)
{
FILE *f = fopen("maxflow.in", "r");
fscanf(f, "%d %d", &n, &m);
for (int i = 1, x, y, z; i <= m; i++)
{
fscanf(f, "%d %d %d", &x, &y, &z);
add(x, y, z);
}
s = 1;
d = n;
fclose(f);
}
inline bool bfs()
{
memset(used, 0, sizeof(used));
Q.push(s);
used[s] = 1;
while (!Q.empty())
{
int nod = Q.front();
Q.pop();
if (nod == d) continue;
for (vector<int>::iterator i = G[nod].begin(); i != G[nod].end(); i++)
{
int fiu = *i;
if (C[nod][fiu] > 0 && used[fiu] == 0)
{
tata[fiu] = nod;
used[fiu] = 1;
Q.push(fiu);
}
}
}
return used[d];
}
void solve()
{
while(bfs())
{
for (vector<int>::iterator i = G[d].begin(); i != G[d].end(); i++)
{
int fiu = *i;
if (C[fiu][d] > 0 && used[fiu] != 0)
{
tata[d] = fiu;
int Min = MAX;
for (int k = d; k != s; k = tata[k])
{
Min = min(Min, C[tata[k]][k]);
}
for (int k = d; k != s; k = tata[k])
{
C[tata[k]][k] -= Min;
C[k][tata[k]] += Min;
}
flux += Min;
}
}
}
}
void write(void)
{
FILE * g = fopen("maxflow.out", "w");
fprintf(g, "%d", flux);
fclose(g);
}
int main()
{
read();
solve();
write();
}