Pagini recente » Cod sursa (job #232305) | Cod sursa (job #1115463) | Cod sursa (job #2074505) | Cod sursa (job #2880118) | Cod sursa (job #795273)
Cod sursa(job #795273)
#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);G[y].push_back(x);
}
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();if(u==n) continue;
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(!viz[n])
break;
for(int i=0;i<G[n].size();i++){
if(a[G[n][i]][n]>0 && viz[G[n][i]])
{ parent[n]=G[n][i];
doPath(n,INF);
maxFlow+=f;
}
}
//doPath(n,INF);
//maxFlow+=f;
}
printf("%ld ",maxFlow);
return 0;
}