Pagini recente » Cod sursa (job #2881986) | Cod sursa (job #300536) | Cod sursa (job #2526180) | Cod sursa (job #500860) | Cod sursa (job #300441)
Cod sursa(job #300441)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
vector <int> nr[1010];
int n,m,rez;
int cap[1010][1010],flux[1010][1010],tata[1010];
bool bf(){
int x,ss,i;
int Q[5010],p,u;
for(i=0;i<=n;++i)
tata[i]=0;
Q[0]=1;
p=u=0;
tata[1]=-1;
while(p<=u){
x=Q[p];
++p;
if(x==n)
continue;
ss=nr[x].size();
for(i=0;i<ss;++i){
if(tata[nr[x][i]] || cap[x][nr[x][i]]==flux[x][nr[x][i]])
continue;
Q[++u]=nr[x][i];
tata[nr[x][i]]=x;
}
}
if(tata[n])
return true;
return false;
}
inline int minim(int a,int b){
return a<b?a:b;
}
void fflux(){
int x;
while(bf()){
for(vector<int>::iterator it=nr[n].begin();it!=nr[n].end();++it){
if(!tata[*it] || cap[*it][n]==flux[*it][n])
continue;
x=n;
rez=1000000000;
tata[n]=*it;
while(tata[x]!=-1){
rez=minim(rez,cap[tata[x]][x]-flux[tata[x]][x]);
x=tata[x];
}
x=n;
while(tata[x]!=-1){
flux[tata[x]][x]+=rez;
flux[x][tata[x]]-=rez;
x=tata[x];
}
}
}
}
void solve(){
int i,ss=0;
for(i=0;i<n;++i)
ss+=flux[i][n];
printf("%d\n",ss);
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i,x,y,z;
scanf("%d%d",&n,&m);
for(i=0;i<m;++i){
scanf("%d%d%d",&x,&y,&z);
nr[x].push_back(y);
nr[y].push_back(x);
cap[x][y]+=z;
}
fflux();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}