Pagini recente » Cod sursa (job #2091448) | Cod sursa (job #2617917) | Cod sursa (job #1611718) | Cod sursa (job #591997) | Cod sursa (job #1134895)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <bitset>
#include <cstring>
#define Nmax 1005
#define INF 0x3f3f3f3f
#define iIT vector<int>::iterator
using namespace std;
int capacity[Nmax][Nmax];
int flow[Nmax][Nmax];
int tata[Nmax];
int N,M,fmax;
vector<int> G[Nmax];
queue<int> Q;
bitset<Nmax> used;
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();
for(iIT it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it] && capacity[k][*it] > flow[k][*it]){
used[*it] = 1;
tata[*it] = k;
Q.push(*it);
}
}
return used[N];
}
inline void FLOW()
{
int nodc,minflow;
while(BFS(1))
for(iIT it = G[N].begin(); it != G[N].end(); ++it)
{
if(flow[*it][N] == capacity[*it][N] || !used[N]) continue;
minflow = INF;
tata[N] = *it; /// venim din it
for(nodc = N; nodc != 1; nodc = tata[nodc])
minflow = min(minflow, capacity[tata[nodc]][nodc] - flow[tata[nodc]][nodc]);
for(nodc = N; nodc != 1; nodc = tata[nodc]){
flow[tata[nodc]][nodc] += minflow;
flow[nodc][tata[nodc]] -= minflow;
}
fmax += minflow;
}
}
inline void print()
{
printf("%d\n",fmax);
fclose(stdin);
fclose(stdout);
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
read();
FLOW();
print();
return 0;
}