Pagini recente » Cod sursa (job #452662) | Cod sursa (job #2318293) | Cod sursa (job #1226016) | Cod sursa (job #1937411) | Cod sursa (job #589602)
Cod sursa(job #589602)
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define Nmax 1024
#define INF 1<<30
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;
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]) {
T[*it]=nod;
viz[*it]=1;
Q.push(*it);
if(*it == D)
return 1;
}
Q.pop();
}
return 0;
}
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)) {
fmin=INF;
for(nod=D; nod!=S; nod=T[nod])
fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
if(fmin==0)
continue;
for(nod=D; 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;
}