Pagini recente » Cod sursa (job #1563390) | Cod sursa (job #561351) | Cod sursa (job #1895939) | Cod sursa (job #133339) | Cod sursa (job #793744)
Cod sursa(job #793744)
#include <stdio.h>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
vector< vector<int> > G(1005);
int n,m;
int a[1005][1005];
int parent[1005];
int f;
int min(int a,int b){return a<b?a:b;}
void doPath(int u,int c){
if(u==1){
f=c;
}
else{
doPath(parent[u],min(a[parent[u]][u],c));
a[parent[u]][u]-=f;
a[u][parent[u]]+=f;
}
}
int main(){
const int INF=1100005;
bitset <1005> viz;
int x,y,c,u,v;
bool found;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %d %d",&x,&y,&c);
a[x][y]=c;G[x].push_back(y);
}
long maxFlow=0;
while(true){
queue<int> q;q.push(1);viz.reset();viz[1]=true;
found=false;
while(!q.empty() && !found){
u=q.front();q.pop();
for(int i=0;i<G[u].size();i++){
if(a[u][G[u][i]]>0 && !viz[G[u][i]]){
v=G[u][i];parent[v]=u;
q.push(v);viz[v]=true;
if(v==n){found=true;break;}
}
}
}
if(!found)
break;
doPath(n,INF);
maxFlow+=f;
}
printf("%ld ",maxFlow);
return 0;
}