Pagini recente » Cod sursa (job #1091180) | Cod sursa (job #2385866) | Cod sursa (job #969581) | Cod sursa (job #133705) | Cod sursa (job #2682433)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int INF = (1LL<<60);
const int N = 1005;
int n,m,x,y,c,Cap[N][N],sink,source=1,t[N],seen[N];
long long Flow[N][N],Min,MaxFlow;
vector <int> G[N],GT[N];
void Read()
{
fin>>n>>m;
while(m--)
{
fin>>x>>y>>c;
Cap[x][y]=c;
G[x].push_back(y);
GT[y].push_back(x);
}
sink=n;
}
queue <int> Q;
int BFS(int source, int sink)
{
memset(seen,0,sizeof(seen));
memset(t,0,sizeof(t));
Q.push(source);
seen[source]=1;
while(!Q.empty())
{
int nod=Q.front();
vector <int> ::iterator it;
Q.pop();
for(it=G[nod].begin();it!=G[nod].end();it++)
{
int next=(*it);
if(!seen[next] && Cap[nod][next]-Flow[nod][next]>0)
{
t[next]=nod;
seen[next]=1;
Q.push(next);
}
}
}
if(!t[sink])
return false;
return true;
}
void FindFlow()
{
while(BFS(source,sink))
{
Min=INF;
int p=sink;
while(t[p])
{
Min=min(Min,Cap[t[p]][p]-Flow[t[p]][p]);
p=t[p];
}
p=sink;
MaxFlow+=Min;
while(t[p])
{
Flow[t[p]][p]+=Min;
Flow[p][t[p]]-=Min;
p=t[p];
}
}
fout<<MaxFlow<<'\n';
}
int main()
{
Read();
FindFlow();
}