Pagini recente » Cod sursa (job #300606) | Cod sursa (job #300402)
Cod sursa(job #300402)
#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;
vector <bool> viz(1010,false);
Q[0]=1;
p=u=0;
viz[1]=true;
while(p<=u){
x=Q[p];
++p;
ss=nr[x].size();
for(i=0;i<ss;++i){
if(!viz[nr[x][i]] && cap[x][nr[x][i]]>flux[x][nr[x][i]]){
Q[++u]=nr[x][i];
viz[nr[x][i]]=true;
tata[nr[x][i]]=x;
if(nr[x][i]==n)
return true;
}
}
}
return false;
}
inline int minim(int a,int b){
return a<b?a:b;
}
void fflux(){
int x;
while(bf()){
x=n;
rez=1000000000;
while(tata[x]){
rez=minim(rez,cap[tata[x]][x]-flux[tata[x]][x]);
x=tata[x];
}
x=n;
while(x){
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;
}