Pagini recente » Cod sursa (job #2122034) | Cod sursa (job #147596) | Cod sursa (job #1371441) | Cod sursa (job #2913351) | Cod sursa (job #935166)
Cod sursa(job #935166)
#include<cstdio>
#include<vector>
using namespace std;
int N,M;
vector<int> nr[1010];
int F[1010][1010],C[1010][1010],tata[1010];
int Q[2000];
int BF(){
for(int i=0;i<=N;++i)
tata[i]=0;
int p,u,x;
Q[0]=1;
tata[1]=1;
p=u=0;
while(p<=u){
x=Q[p++];
if(x==N)
continue;
for(size_t i=0;i<nr[x].size();++i){
if(!tata[nr[x][i]] && F[x][nr[x][i]]<C[x][nr[x][i]]){
Q[++u]=nr[x][i];
tata[nr[x][i]]=x;
}
}
}
tata[1]=0;
return tata[N];
}
void solve(){
while(BF()){
for(int nod=1;nod<N;++nod){
if(!tata[nod] || F[nod][N]==C[nod][N])
continue;
tata[N]=nod;
int cur=N,max=1000000000;
while(tata[cur]){
if(C[tata[cur]][cur]-F[tata[cur]][cur]<max)
max=C[tata[cur]][cur]-F[tata[cur]][cur];
cur=tata[cur];
}
if(!max)
continue;
cur=N;
while(tata[cur]){
F[tata[cur]][cur]+=max;
F[cur][tata[cur]]-=max;
cur=tata[cur];
}
}
}
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i,x,y,c;
scanf("%d%d",&N,&M);
for(i=0;i<M;++i){
scanf("%d%d%d",&x,&y,&c);
C[x][y]=c;
nr[x].push_back(y);
}
solve();
x=0;
for(i=1;i<N;++i)
x+=F[i][N];
printf("%d\n",x);
fclose(stdin);
fclose(stdout);
return 0;
}