Pagini recente » Cod sursa (job #2477412) | Cod sursa (job #2946397) | Cod sursa (job #1840616) | Cod sursa (job #146199) | Cod sursa (job #1399130)
#include <fstream>
#include <vector>
#include <cstring>
#include <bitset>
#include <queue>
using namespace std;
ifstream is("maxflow.in");
ofstream os("maxflow.out");
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int n, m, c[MAXN][MAXN], t[MAXN];
vector<int> G[MAXN];
bitset<MAXN> v;
queue<int> Q;
inline bool Bfs(int source, int sink)
{
v.reset();
v[source] = 1;
Q.push(source);
while(!Q.empty())
{
int x = Q.front();
Q.pop();
if( x == sink )
continue;
for(const auto& e : G[x])
if(!v[e] && c[x][e] > 0)
{
v[e] = 1;
t[e] = x;
Q.push(e);
}
}
return v[sink];
}
inline int maxflow(int source, int sink)
{
int maxflow = 0, fmin;
while(Bfs(source, sink))
for( const auto& e : G[source] )
{
if(!v[e] || c[e][sink] <= 0)
continue;
t[sink] = e;
fmin = INF;
for( int i = sink; i != source; i = t[i] )
fmin = min(fmin, c[t[i]][i]);
for( int i = sink; i != source; i = t[i] )
{
c[t[i]][i] -= fmin;
c[i][t[i]] += fmin;
}
maxflow += fmin;
}
return maxflow;
}
void Read();
int main()
{
is >> n >> m;
int a, b, C;
for( int i = 1; i <= m; ++i )
{
is >> a >> b >> C;
G[a].push_back(b);
c[a][b] = C;
G[b].push_back(a);
}
os << maxflow(1, n);
is.close();
os.close();
return 0;
}