Pagini recente » Cod sursa (job #622428) | Cod sursa (job #459179) | Cod sursa (job #534910) | Cod sursa (job #2332105) | Cod sursa (job #1087747)
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define fi first
#define se second
#define pe pair<int,int>
#define mp make_pair
using namespace std;
const int MAX_N=1010;
int n;
vector<int> A[MAX_N];
int cap[MAX_N][MAX_N];
int flux[MAX_N][MAX_N];
bool viz[MAX_N];
int dad[MAX_N];
void bfs() {
memset(viz,0,sizeof(viz));
memset(dad,0,sizeof(dad));
queue<int> Q;
Q.push(1);
viz[1]=true;
while(!Q.empty()) {
int nod=Q.front();
Q.pop();
for(auto it=A[nod].begin(); it!=A[nod].end(); it++) {
if(cap[nod][*it]>flux[nod][*it]&&!viz[*it]) {
Q.push(*it);
viz[*it]=true;
dad[*it]=nod;
}
}
}
}
int solve() {
int ans=0;
while(true) {
bfs();
if(!dad[n]) {
break;
}
int add=cap[dad[n]][n]-flux[dad[n]][n];
int nod=n;
while(nod!=1) {
add=min(add,cap[dad[nod]][nod]-flux[dad[nod]][nod]);
nod=dad[nod];
}
ans+=add;
nod=n;
while(nod!=1) {
flux[dad[nod]][nod]+=add;
flux[nod][dad[nod]]-=add;
nod=dad[nod];
}
for(auto it=A[n].begin(); it!=A[n].end(); it++) {
if(cap[*it][n]<=flux[*it][n]) {
continue;
}
int add=cap[*it][n]-flux[*it][n];
int nod=*it;
while(nod!=1) {
add=min(add,cap[dad[nod]][nod]-flux[dad[nod]][nod]);
nod=dad[nod];
}
if(!ans) {
continue;
}
ans+=add;
flux[*it][n]+=add;
flux[n][*it]-=add;
nod=*it;
while(nod!=1) {
flux[dad[nod]][nod]+=add;
flux[nod][dad[nod]]-=add;
nod=dad[nod];
}
}
}
return ans;
}
int main() {
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
A[a].push_back(b);
A[b].push_back(a);
cap[a][b]=c;
}
printf("%d",solve());
/*for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(cap[i][j]) {
printf("%d %d %d/%d\n",i,j,flux[i][j],cap[i][j]);
}
}
}*/
return 0;
}