Pagini recente » Cod sursa (job #850914) | Istoria paginii runda/bpc9/clasament | Diferente pentru home intre reviziile 300 si 299 | Cod sursa (job #2040748) | Cod sursa (job #1790787)
#include <bits/stdc++.h>
using namespace std;
#define start 1
#define dest N
const int Nmax = 1005;
vector<vector<int> > G;
bitset<Nmax> used;
queue<int> Q;
int N, M, daddy[Nmax];
int flow[Nmax][Nmax], capacity[Nmax][Nmax];
void insertEdge(int from, int to, int flow, int capac)
{
G[from].push_back(to);
G[to].push_back(from);
capacity[from][to] = capac;
}
void readNetwork()
{
cin.sync_with_stdio(false);
cin >> N >> M;
G.resize(N+1);
for(int i = 1; i <= M; ++i) {
int a,b,c;
cin >> a >> b >> c;
insertEdge(a,b,0,c);
}
}
bool BFS(int k)
{
used = 0;
memset(daddy, 0, sizeof(daddy));
used[k] = true;
Q.push(k);
while(!Q.empty()) {
k = Q.front(); Q.pop();
if(k == dest)
continue;
for(auto it : G[k])
if(!used[it] && capacity[k][it] != flow[k][it])
{
used[it] = true;
Q.push(it);
daddy[it] = k;
}
}
return used[dest];
}
int maxFlow(int k)
{
const int INF = 0x3f3f3f3f;
int maxFlow = 0;
while(BFS(k))
for(auto it : G[dest])
{
if(!used[it] || capacity[it][dest] == flow[it][dest])
continue;
daddy[dest] = it;
int crt = INF;
for(int nodc = dest; nodc != start; nodc = daddy[nodc])
crt = min(crt, capacity[daddy[nodc]][nodc] - flow[daddy[nodc]][nodc]);
for(int nodc = dest; nodc != start; nodc = daddy[nodc])
{
flow[daddy[nodc]][nodc] += crt;
flow[nodc][daddy[nodc]] -= crt;
}
maxFlow += crt;
}
return maxFlow;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
readNetwork();
cout << maxFlow(start);
return 0;
}