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