Pagini recente » Cod sursa (job #1622802) | Cod sursa (job #2086004) | Cod sursa (job #1247886) | Cod sursa (job #1066731) | Cod sursa (job #902983)
Cod sursa(job #902983)
#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,0,sizeof(t));
t[1]=-1;
Q.clear();
Q.push_back(1);
while(Q.size()>0)
{
int nod=Q.front();
for(int i=0;i<graph[nod].size();++i)
{
int nod2=graph[nod][i];
if(t[nod2]==0&&cap[nod][nod2]-flow[nod][nod2]>0)
{
if(nod2==n)ret=1;
else
{
t[nod2]=nod;
Q.push_back(nod2);
}
}
}
Q.pop_front();
}
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);
graph[y].push_back(x);
}
while(bf())
{
for(int i=0;i<graph[n].size();++i)
{
int nod=graph[n][i];
if(t[nod]&&cap[nod][n]-flow[nod][n]>0)
{
t[n]=nod;
int minim = 9999999999;
for(int j=n;j!=1;j=t[j])
minim=min(minim,cap[t[j]][j]-flow[t[j]][j]);
ras+=minim;
for(int j=n;j!=1;j=t[j])
{
flow[t[j]][j]+=minim;
flow[j][t[j]]-=minim;
}
}
}
}
printf("%d\n",ras);
}