Pagini recente » Cod sursa (job #655237) | Cod sursa (job #868823) | Cod sursa (job #3002230) | Cod sursa (job #1671399) | Cod sursa (job #1389610)
#include <fstream>
#include <vector>
#include <bitset>
#include <cstring>
#include <queue>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
ifstream is("maxflow.in");
ofstream os("maxflow.out");
int n, m;
vector<vector<int>> g;
int c[1020][1020];
bitset<1024> v;
queue<int> Q;
int t[1020];
bool BFS(int x, int sink)
{
v.reset();
v[x] = 1;
Q.push(x);
while(!Q.empty())
{
x = Q.front();
Q.pop();
if (x == sink)
continue;
for(const auto & y : g[x])
{
if(!v[y] && c[x][y] > 0)
{
v[y] = 1;
t[y] = x;
Q.push(y);
}
}
}
return v[n];
}
int MaxFlow(int source, int sink)
{
int maxflow = 0;
int fmin;
while(BFS(source, sink))
{
for(const auto & x: g[sink])
{
if(!v[x] || c[x][sink] <= 0)
{
continue;
}
t[sink] = x;
fmin = INF;
for(int i = sink; i != source; i = t[i])
{
fmin = min(fmin, c[t[i]][i]);
}
if(!fmin) continue;
for(int i = sink; i != source; i = t[i])
{
c[t[i]][i] -= fmin;
c[i][t[i]] += fmin;
}
maxflow += fmin;
}
}
/*
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
os << c[i][j] << ' ';
}
os << '\n';
}*/
//os << '\n';
return maxflow;
}
int main()
{
is >>n >> m;
int x, y, z;
g = vector<vector<int>>(n+1);
for(int i = 1; i <= m; ++i)
{
is >> x >> y >> z;
g[x].push_back(y);
g[y].push_back(x);
c[x][y] = z;
}
//os << MaxFlow(1, n);
/*
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
os << c[i][j] << ' ';
}
os << '\n';
}
*/
//os << '\n';
os << MaxFlow(1,n);
is.close();
os.close();
return 0;
}