Pagini recente » Cod sursa (job #2527162) | Cod sursa (job #2983520) | Cod sursa (job #559165) | Cod sursa (job #119002) | Cod sursa (job #1686166)
#include <stdio.h>
#include <queue>
#include <vector>
#include <cstring>
#define nmax 1010
using namespace std;
int n,m,x,y,z,fmax;
int capacity[nmax][nmax],flux[nmax][nmax];
int tata[nmax];
bool fr[nmax];
vector <int> g[nmax];
queue <int> que;
bool bfs()
{
memset(fr,0,sizeof(fr));
que.push(1); fr[1]=1;
while (!que.empty()) {
int x=que.front(); que.pop();
if (x==n) continue;
for (int i=0;i<(int)g[x].size();i++)
if (!fr[g[x][i]] && flux[x][g[x][i]]!=capacity[x][g[x][i]]) {
tata[g[x][i]]=x; fr[g[x][i]]=true; que.push(g[x][i]);
}
}
return (fr[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",&x,&y,&z); g[x].push_back(y); g[y].push_back(x); capacity[x][y]=z;
}
while (bfs()) {
for (int i=0;i<g[n].size();i++)
if (fr[g[n][i]] && capacity[g[n][i]][n]!=flux[g[n][i]][n]) {
tata[n]=g[n][i]; int fmin=2e9;
for (int j=n;j>1;j=tata[j]) fmin=min(fmin,capacity[tata[j]][j]-flux[tata[j]][j]);
if (fmin==0) continue;
for (int j=n;j>1;j=tata[j]) {
flux[tata[j]][j]+=fmin;
flux[j][tata[j]]-=fmin;
}
fmax+=fmin;
}
}
printf("%d",fmax);
return 0;
}