Pagini recente » Cod sursa (job #2030634) | Cod sursa (job #614937) | Cod sursa (job #1081128) | Cod sursa (job #1811644) | Cod sursa (job #1127736)
#include <fstream>
#include <vector>
#include <algorithm>
#define Nmax 1009
#define Mmax 5009
#define pb push_back
#define mp make_pair
#include <queue>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int N,M,Cap[Nmax][Nmax],flow[Nmax][Nmax],maxFlow,ante[Nmax],Sink,Source;
vector < int > G[Nmax];
queue <int > Q;
void ReadInput()
{
f>>N>>M;
Source=1,Sink=N;
for(int i=1;i<=M;++i)
{
int x,y,c;
f>>x>>y>>c;
G[x].pb(y),G[y].pb(x);
Cap[x][y]+=c;
}
}
int BFS()
{
memset(ante,0,sizeof(ante));
ante[Source]=Source;
for(Q.push(Source); !Q.empty(); Q.pop())
{
int node=Q.front();
if(node==Sink)continue;
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();++it)
if(!ante[*it] && flow[node][*it]<Cap[node][*it])
{
ante[*it]=node;
Q.push(*it);
}
}
return ante[Sink];
}
void GetFlow()
{
for( ; BFS();)
for(vector<int>::iterator it=G[Sink].begin();it!=G[Sink].end();++it)
if(ante[*it] && flow[*it][Sink]<Cap[*it][Sink])
{
ante[Sink]=*it;
int minFlow=2000000000;
for( int i=Sink; i!=Source ; i=ante[i])
minFlow=min(minFlow,Cap[ante[i]][i]-flow[ante[i]][i]);
if(minFlow)
{
for( int i=Sink; i!=Source ; i=ante[i])
{
flow[ante[i]][i]+=minFlow;
flow[i][ante[i]]-=minFlow;
}
maxFlow+=minFlow;
}
}
}
int main()
{
ReadInput();
GetFlow();
g<<maxFlow<<'\n';
f.close();g.close();
return 0;
}