Pagini recente » Cod sursa (job #3171815) | Cod sursa (job #2632251) | Cod sursa (job #1384003) | Cod sursa (job #2525114) | Cod sursa (job #1516655)
#include<fstream>
#include<vector>
#include<deque>
#include<climits>
#define N 1002
#define foreach(m,i) for(int i=1;i<=m;i++)
#define pb(x) push_back(x)
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
deque <int> q;
bool viz[N];
int F[N][N],T[N],C[N][N],n,m,x,y,z,f,Min,nod,v;
vector <int> G[N];
int bfs()
{
q.clear();
foreach(n,i)
viz[i]=0;
q.pb(1);
viz[1]=1;
while(!q.empty())
{
nod=*q.begin();
if(nod==n)
return 1;
foreach((int)G[nod].size(),i)
{
v=G[nod][i-1];
if(!viz[v] and C[nod][v]>F[nod][v])
{
q.pb(v);
T[v]=nod;
viz[v]=1;
}
}
q.pop_front();
}
return 0;
}
int main()
{
cin>>n>>m;
foreach(m,i)
{
cin>>x>>y>>z;
G[x].pb(y);
G[y].pb(x);
C[x][y]=z;
}
while(bfs())
foreach((int)G[n].size(),i)
{
nod=G[n][i-1];
if(viz[nod])
{
Min=C[nod][n]-F[nod][n];
while(T[nod]!=0 and Min!=0)
{
Min=min(Min,C[T[nod]][nod]-F[T[nod]][nod]);
nod=T[nod];
}
}
if(Min!=0)
{
f+=Min;
nod=G[n][i-1];
F[nod][n]+=Min;
F[n][nod]-=Min;
while(T[nod]!=0)
{
F[T[nod]][nod]+=Min;
F[nod][T[nod]]-=Min;
nod=T[nod];
}
}
}
cout<<f;
return 0;
}