Pagini recente » Cod sursa (job #3289102) | Cod sursa (job #714266) | Cod sursa (job #2855471) | Cod sursa (job #354796) | Cod sursa (job #763415)
Cod sursa(job #763415)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N = 1010;
vector <int> vec[N];
int n, m, a, b, c, sol, ok = 1;
int capacitate[N][N], f[N][N];
int fol[N], tata[N], flux[N];
void bfs()
{
int nod;
queue <int> q;
memset(fol, 0, sizeof(fol));
memset(tata, 0, sizeof(tata));
memset(flux, 0, sizeof(flux));
flux[1] = 0x3f3f3f3f;
fol[1] = 1;
q.push(1);
while(!q.empty()) {
nod = q.front();
q.pop();
for(vector <int>::iterator it = vec[nod].begin(); it != vec[nod].end(); ++it)
if(!fol[*it] && capacitate[nod][*it] > 0) {
fol[*it] = 1;
flux[*it] = min(flux[nod], capacitate[nod][*it]);
tata[*it] = nod;
q.push(*it);
}
if(fol[n])
break;
}
/* for(int i = 1; i <= n; ++i)
printf("%d %d %d %d\n", i, fol[i], flux[i], tata[i]);
printf("\n");*/
ok = flux[n];
if(ok) {
for(int i = n; i != 1; i = tata[i]) {
capacitate[tata[i]][i] -= flux[n];
capacitate[i][tata[i]] += flux[n];
}
//fprintf(stderr, "%d ", flux[n]);
}
/*for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (capacitate[i][j])
printf("%d %d %d\n", i, j, capacitate[i][j]);
printf("\n\n");*/
}
int main()
{
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i) {
scanf("%d %d %d", &a, &b, &c);
vec[a].push_back(b);
vec[b].push_back(a);
capacitate[a][b] += c;
}
while(ok) {
bfs();
sol += ok;
}
printf("%d\n", sol);
return 0;
}