Pagini recente » Cod sursa (job #2882222) | Cod sursa (job #999309) | Cod sursa (job #1457088) | Cod sursa (job #998172) | Cod sursa (job #1136187)
#include <cstdio>
#include <algorithm>
#include <bitset>
#include <queue>
#include <vector>
#define Nmax 1050
#define INF 0x3f3f3f3f
using namespace std;
vector<int> G[Nmax];
queue<int> Q;
bitset<Nmax>used;
int capacity[Nmax][Nmax],flow[Nmax][Nmax],daddy[Nmax];
int N,M,maxFLOW,minFLOW;
inline void read()
{
scanf("%d%d",&N,&M);
int a,b,c;
for(int i = 1; i <= M; ++i)
{
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(b);
G[b].push_back(a);
capacity[a][b] = c;
}
}
inline bool BFS(int k)
{
used = 0;
used[k] = 1;
Q.push(k);
while(!Q.empty())
{
k = Q.front(); Q.pop();
if(k == N)continue;
for(vector<int> ::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it] && capacity[k][*it] - flow[k][*it] != 0)
{
used[*it] = 1;
daddy[*it] = k;
Q.push(*it);
}
}
return used[N];
}
inline void FLOW(int k)
{
while(BFS(k))
for(vector<int>::iterator it = G[N].begin(); it != G[N].end(); ++it)
{
if(capacity[*it][N] == flow[*it][N] || !used[N]) continue;
daddy[N] = *it;
minFLOW = INF;
for(int nodc = N; nodc != 1; nodc = daddy[nodc])
minFLOW = min( minFLOW, capacity[daddy[nodc]][nodc] - flow[daddy[nodc]][nodc]);
for(int nodc = N; nodc != 1; nodc = daddy[nodc])
{
flow[daddy[nodc]][nodc] += minFLOW;
flow[nodc][daddy[nodc]] -= minFLOW;
}
maxFLOW += minFLOW;
}
printf("%d\n",maxFLOW);
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
read();
FLOW(1);
return 0;
}