Pagini recente » Cod sursa (job #620730) | Cod sursa (job #1882746) | Cod sursa (job #1239766) | Cod sursa (job #129655) | Cod sursa (job #241383)
Cod sursa(job #241383)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=1001;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N,M,source,sink;
int c[NMAX][NMAX],r[NMAX][NMAX];
vector<int> G[NMAX],a;
queue<int> Q;
bool ok=true;
int t[NMAX],aug;
void BF(){
int x;
vector<int>::iterator it;
aug=0;ok=false;
memset(t,0,sizeof(t));
Q.push(source);t[1]=1;
while (!Q.empty()){
x=Q.front();Q.pop();
for (it=G[x].begin();it!=G[x].end();++it)
if (!t[*it])
if (r[x][*it]>0) t[*it]=x,Q.push(*it);}
if (!t[sink]) return;
ok=true;
for (it=a.begin();it!=a.end();++it)
if (r[*it][sink]>0){
int rmin=r[*it][sink];
for (x=*it;x!=source;x=t[x])
rmin=min(rmin,r[t[x]][x]);
aug+=rmin;
r[*it][sink]-=rmin;
r[sink][*it]+=rmin;
for (x=*it;x!=source;x=t[x]){
r[t[x]][x]-=rmin;
r[x][t[x]]+=rmin;}
}
}
int flow(){
int sol=0;
while (ok){
BF();
sol+=aug;
}
return sol;
}
int main(){
int x,y,k;
fin>>N>>M;
source=1;sink=N;
while (M--){
fin>>x>>y>>k;
G[x].push_back(y);
G[y].push_back(x);
r[x][y]=c[x][y]=k;
if (y==sink) a.push_back(x);}
fout<<flow();
return 0;
}