Pagini recente » Cod sursa (job #599820) | Cod sursa (job #2862213) | Cod sursa (job #2915880) | Cod sursa (job #970657) | Cod sursa (job #582530)
Cod sursa(job #582530)
#include<cstdio>
#include<queue>
#include<bitset>
using namespace std;
const char in[]="maxflow.in";
const char out[]="maxflow.out";
const int Max_N = 1050;
bitset<Max_N>viz;
queue<int>Q;
vector<int>G[Max_N];
int C[Max_N][Max_N], F[Max_N][Max_N], flow, min_flow, T[Max_N];
int N, M;
bool BF()
{
while(Q.size())Q.pop();
viz.reset();
Q.push(1);
viz[1] = true;
while(Q.size())
{
int nod = Q.front();
Q.pop();
for(unsigned i = 0 ; i < G[nod].size() ; ++i)
{
int x = G[nod][i];
if(!viz[x] && C[nod][x] - F[nod][x] > 0)
{
T[x] = nod;
Q.push(x);
viz[x] = true;
if(x == N) return true;
}
}
}
return viz[N];
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d %d", &N, &M);
for(int i = 1 ; i <= M ; ++i)
{
int x, y, cap;
scanf("%d %d %d", &x, &y, &cap);
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = cap;
}
while(BF())
{
for(unsigned i = 0 ; i < G[N].size() ; ++i)
{
int x = G[N][i];
if(F[x][N] == C[x][N] || !viz[x])continue;
T[N] = x;
min_flow = 0x3f3f3f3f;
for(int i = N ; i != 1; i = T[i])
min_flow= min(min_flow, C[T[i]][i] - F[T[i]][i]);
for(int i = N ; i != 1; i = T[i])
{
F[T[i]][i] += min_flow;
F[i][T[i]] -= min_flow;
}
flow += min_flow;
}
}
printf("%d\n", flow);
return 0;
}