Pagini recente » Cod sursa (job #1604645) | Cod sursa (job #1543756) | Cod sursa (job #1409254) | Cod sursa (job #683694) | Cod sursa (job #703233)
Cod sursa(job #703233)
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define infile "maxflow.in"
#define outfile "maxflow.out"
#define n_max 1005
#define nxt *it
#define pb push_back
#define INF 1<<30
#define FOR(g) \
for(vector<int> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;
vector <int> v[n_max];
int C[n_max][n_max], F[n_max][n_max];
int T[n_max];
queue <int> q;
int Src, Sink;
int N, M;
void citeste()
{
freopen(infile,"r",stdin);
int x, y, cost;
scanf("%d %d", &N, &M);
while(M--)
{
scanf("%d %d %d", &x, &y, &cost);
v[x].pb(y);
v[y].pb(x);
C[x][y] = cost;
}
Src = 1;
Sink = N;
fclose(stdin);
}
int BFS()
{
memset(T, 0, sizeof(T));
q.push(Src);
T[Src] = -1;
while(!q.empty())
{
int x = q.front();
q.pop();
if(x == Sink)
continue;
FOR(v[x])
if(C[x][nxt] != F[x][nxt] && !T[nxt]){
T[nxt] = x;
q.push(nxt);
}
}
return T[Sink] != 0;
}
int MaxFlow()
{
int Flow = 0;
while(BFS())
FOR(v[Sink]){
if(F[nxt][Sink] == C[nxt][Sink] || !T[nxt])
continue;
int flow = INF;
T[Sink] = nxt;
for(int i = Sink; i != Src; i = T[i])
flow = min(flow, C[T[i]][i] - F[T[i]][i]);
if(!flow)
continue;
for(int i = Sink; i != Src; i = T[i]){
F[T[i]][i] += flow;
F[i][T[i]] -= flow;
}
Flow += flow;
}
return Flow;
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%d\n", MaxFlow());
fclose(stdout);
}
int main()
{
citeste();
afiseaza();
return 0;
}