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