Pagini recente » Cod sursa (job #648210) | Monitorul de evaluare | Cod sursa (job #492188) | Cod sursa (job #1367441) | Cod sursa (job #1072015)
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>
using namespace std;
const int INF = (1<<31)-1;
const int NMAX = 1005;
int N,M,Fm;
vector<int> V[NMAX];
int C[NMAX][NMAX];
int F[NMAX][NMAX];
deque<int> Q;
bool viz[NMAX];
int T[NMAX];
int BFS()
{
int x,y;
vector<int>::iterator it;
Q.resize(0);
memset(viz,0,sizeof(viz));
Q.push_back(1);
viz[1]=1;
for(; !Q.empty();)
{
x=Q.front();
Q.pop_front();
for(it=V[x].begin(); it!=V[x].end(); it++)
{
y=*it;
if(C[x][y]==F[x][y] || viz[y]) continue;
viz[y]=1;
Q.push_back(y);
T[y]=x;
}
}
return viz[N];
}
int main()
{
int x,a,b,c,v;
vector<int>::iterator it;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&N,&M);
for(; M; --M)
{
scanf("%d%d%d",&a,&b,&c);
C[a][b]+=c;
V[a].push_back(b);
V[b].push_back(a);
}
for(; BFS();)
for(it=V[N].begin();it!=V[N].end();it++)
{
x=*it;
if(C[x][N]==F[x][N] || !viz[x]) continue;
T[N]=x;
v=INF;
for(x=N; x!=1; x=T[x])
v=min(v,C[T[x]][x]-F[T[x]][x]);
if(v==0) continue;
for(x=N; x!=1; x=T[x])
{
F[T[x]][x]+=v;
F[x][T[x]]-=v;
}
Fm+=v;
}
printf("%d\n",Fm);
return 0;
}