Pagini recente » Cod sursa (job #2961599) | Cod sursa (job #902899)
Cod sursa(job #902899)
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>
#include<algorithm>
#define INF 1001
using namespace std;
int cap[INF][INF],flow[INF][INF],n,m,t[INF],ras=0;
bool used[INF];
deque<int> Q;
vector<int> graph[INF];
int bf()
{
int ret=0;
//memset(t,sizeof(t),0);
memset(used,0,sizeof(used));
Q.clear();
Q.push_back(1);
int ind=0;
while(ind<Q.size())
{
// int s=Q.size();
int nod=Q[ind];
for(int i=0;i<graph[nod].size();++i)
{
int nod2=graph[nod][i];
if(!used[nod2]&&cap[nod][nod2]-flow[nod][nod2]>0)
{
if(nod2==n)ret=1;
else
{
used[nod2]=1;
t[nod2]=nod;
Q.push_back(nod2);
}
}
}
//if(s==Q.size())return ret;
++ind;
}
return ret;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<m;++i)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
cap[x][y]=c;
graph[x].push_back(y);
}
while(bf())
{
for(int i=0;i<Q.size();++i)
{
int nod=Q[i];
if(cap[nod][n]-flow[nod][n]>0)
{
int minim=cap[nod][n]-flow[nod][n];
for(int j=nod;j!=1;j=t[j])
minim=min(minim,cap[t[j]][j]-flow[t[j]][j]);
flow[nod][n]+=minim;
ras+=minim;
flow[n][nod]-=minim;
for(int j=nod;j!=1;j=t[j])
{
flow[t[j]][j]+=minim;
flow[j][t[j]]-=minim;
}
}
}
}
printf("%d\n",ras);
}