Pagini recente » Cod sursa (job #846738) | Cod sursa (job #837728) | Cod sursa (job #2054375) | Cod sursa (job #1096468) | Cod sursa (job #928244)
Cod sursa(job #928244)
#include <stdio.h>
#include <vector>
#include <queue>
#define nmax 1001
#define oo 0x3f3f3f3f //infinit
using namespace std;
vector <int> G[nmax];
int cap[nmax][nmax];
bool use[nmax];
queue <int> q;
int flux[nmax][nmax];
int t[nmax];
int n, m;
int bfs (){
for (int i = 0; i <= n; ++i) use[i] = 0;
for (int i = 0; i <= n; ++i) t[i] = 0;
q.push(1);
use[1] = 1;
while (!q.empty()) {
int u = q.front();
if(u == n) {
q.pop();
continue;
}
for (int i = 0; i < G[u].size(); ++i) {
int dest1 = G[u][i];
int cap1 = cap[u][dest1];
if (!use[dest1])
if (cap1 - flux[u][dest1] > 0)
{
q.push(dest1);
t[dest1] = u;
use[dest1] = 1;
}
}
q.pop();
}
return use[n];
}
int edmond_karp(){
int j;
int minn;
int flow = 0;
while(bfs()) {
for(int i = 0; i < G[n].size(); i++)
if(use[G[n][i]] && flux[G[n][i]][n] < cap[G[n][i]][n]){
t[n] = G[n][i];
minn = oo;
for (j = n; t[j] !=0; j = t[j])
if(minn > cap[t[j]][j]-flux[t[j]][j])
minn = cap[t[j]][j] - flux[t[j]][j];
for (j = n; t[j] !=0; j = t[j]) {
flux[t[j]][j] += minn;
flux[j][t[j]] -= minn;
}
flow += minn;
}
}
return flow;
}
int main() {
int x, y, z;
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", &x, &y, &z);
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = z;
}
printf ("%d", edmond_karp());
}