Pagini recente » Cod sursa (job #697568) | Cod sursa (job #2784331) | Cod sursa (job #1081350) | Cod sursa (job #396913) | Cod sursa (job #1649461)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
const int N = 1005;
const int INF = 999999999;
vector<int> a[N];
queue<int> q;
int n,m,f[N][N],c[N][N],t[N],s,d,flux;
bool bfs()
{
int ok=0,k,i;
q.push(s);
memset(t,0,sizeof t);
t[s]=-1;
while(!q.empty())
{
k=q.front();
q.pop();
for(i=0;i<a[k].size();i++)
if(t[a[k][i]]==0 && f[k][a[k][i]]<c[k][a[k][i]])
if(a[k][i]==d)
ok=1;
else
t[a[k][i]]=k,q.push(a[k][i]);
}
return ok;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
int i,j,x,y,z,minn;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
a[x].push_back(y);
a[y].push_back(x);
c[x][y]=z;
}
s=1;d=n;
while(bfs())
for(i=0;i<a[d].size();i++)
{
minn=INF;
x=a[d][i];
if(t[x] && f[x][d]<c[x][d])
{
t[d]=x;
for(j=d;j!=s;j=t[j])
minn=min(minn,c[t[j]][j]-f[t[j]][j]);
if(minn<=0)
continue;
flux+=minn;
for(j=d;j!=s;j=t[j])
{
f[t[j]][j]+=minn;
f[j][t[j]]-=minn;
}
}
}
printf("%d\n",flux);
return 0;
}