Pagini recente » Cod sursa (job #279342) | Cod sursa (job #3250842) | Cod sursa (job #1487391) | Cod sursa (job #2820822) | Cod sursa (job #1147371)
#include <fstream>
#include <iostream>
#include <bitset>
#include <vector>
#include <queue>
#define N 1003
#define INF 110005000
using namespace std;
bitset<N> viz;
vector<int> G[N];
int a[N][N];
int n,m,s,t;
int parent[N];
int f;
void augment_path(int u, int maxEdge) {
if (u==s) {
f = maxEdge;
}
else {
augment_path(parent[u], min(maxEdge, a[parent[u]][u]));
a[parent[u]][u]-=f;
a[u][parent[u]]+=f;
}
}
int main() {
int x,y,c;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
in>>n>>m;
s=1;t=n;
for(int i=0;i<m;i++) {
in>>x>>y>>c;
a[x][y] = c;
G[x].push_back(y);
G[y].push_back(x);
}
int mf = 0;
while(true) {
queue<int> q;
bitset<1003> viz;viz.reset();
q.push(s);
viz[s] = 1;
while(!q.empty()) {
int u = q.front();q.pop();
if(u==t) break;
for(int i=0;i<G[u].size();i++) {
int v = G[u][i];
if(!viz[v] && a[u][v]>0) {
viz[v] = true;
parent[v] = u;
q.push(v);
}
}
}
if(!viz[t]) break;
for(int i=0;i<G[t].size();i++) {
int u = G[t][i];
if(viz[u] && a[u][t]>0) {
parent[t] = u;
augment_path(t,INF);
mf+=f;
}
}
}
out<<mf;
return 0;
}