Pagini recente » Cod sursa (job #2155913) | Cod sursa (job #464581) | Cod sursa (job #2075340) | Cod sursa (job #769292) | Cod sursa (job #1262862)
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
#define NMAX 1002
#define INF 2000000000
int n, m, sol, s, f, nrs;
int flow[NMAX][NMAX], t[NMAX], fin[NMAX];
vector<int> v[NMAX];
queue<int> q;
void bfs(int nod)
{
memset(t, 0, sizeof(t));
while(!q.empty())q.pop();
nrs=0;
t[s]=s;
q.push(nod);
int fiu;
while(!q.empty())
{
nod=q.front();
q.pop();
for(int i=0; i<v[nod].size(); ++i)
{
fiu=v[nod][i];
if(!t[fiu] && flow[nod][fiu]>0)
{
if(fiu==f)
{
fin[++nrs]=nod;
continue;
}
t[fiu]=nod;
q.push(fiu);
}
}
}
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int x, y, c, fmin;
scanf("%d%d", &n, &m);
s=1;
f=n;
for(int i=1; i<=m; ++i)
{
scanf("%d%d%d", &x, &y, &c);
v[x].push_back(y);
v[y].push_back(x);
flow[x][y]=c;
}
while(true)
{
bfs(s);
if(!nrs)break;
for(int j=1; j<=nrs; ++j)
{
fmin=INF;
t[f]=fin[j];
for(int nod=f; t[nod]!=nod; nod=t[nod])
if(flow[t[nod]][nod]<fmin)
fmin=flow[t[nod]][nod];
for(int nod=f; t[nod]!=nod; nod=t[nod])
{
flow[t[nod]][nod]-=fmin;
flow[nod][t[nod]]+=fmin;
}
sol+=fmin;
}
}
printf("%d\n", sol);
return 0;
}