Pagini recente » Cod sursa (job #1744826) | Cod sursa (job #1347446) | Cod sursa (job #918561) | Cod sursa (job #900183) | Cod sursa (job #589610)
Cod sursa(job #589610)
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define Nmax 1024
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int C[Nmax][Nmax], F[Nmax][Nmax], T[Nmax], N, M, S, D, flux;
vector<int> G[Nmax];
bool BF(int S, int D) {
queue<int> Q;
bitset<Nmax> viz;
int nod;
bool ok=false;
Q.push(S); viz[S]=1;
while(!Q.empty()) {
nod=Q.front();
for(vector<int>:: iterator it=G[nod].begin(); it!=G[nod].end(); ++it)
if(!viz[*it] && F[nod][*it]<C[nod][*it]) {
if(*it==D) {
ok=true;
continue;
}
else {
T[*it]=nod;
viz[*it]=1;
Q.push(*it);
}
}
Q.pop();
}
return ok;
}
int main() {
int x, y, z, nod, fmin;
f>>N>>M; S=1; D=N;
while(M--) {
f>>x>>y>>z;
C[x][y]=z;
G[x].push_back(y);
G[y].push_back(x);
}
while(BF(S,D))
for(vector<int>:: iterator it=G[D].begin(); it!=G[D].end(); ++it) {
fmin=C[nod][D]-F[nod][D];
for(nod=*it; nod!=S; nod=T[nod])
fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
if(fmin==0)
continue;
F[*it][D]+=fmin;
F[D][*it]-=fmin;
for(nod=*it; nod!=S; nod=T[nod]) {
F[T[nod]][nod]+=fmin;
F[nod][T[nod]]-=fmin;
}
flux+=fmin;
}
g<<flux<<"\n";
f.close();
g.close();
return 0;
}