Pagini recente » Cod sursa (job #1063914) | Cod sursa (job #2100350) | Cod sursa (job #1818851) | Cod sursa (job #755897) | Cod sursa (job #929288)
Cod sursa(job #929288)
#include<stdio.h>
#include<vector>
using namespace std;
#define max 1024
#define inf 0x3f3f3f3f
#define mins(a,b) ((a)<(b) ? (a):(b))
int val[max][max];
int f[max][max];
int r[max],n,m;
int cd[max],viz[max];
vector<int> roads[max];
int BFS()
{
int i,j,nod,v;
cd[0]=cd[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(int i=1;i<= cd[0]; i++)
{
nod=cd[i];
if( nod == n) continue;
for(j=0;j < roads[nod].size();j++)
{
v=roads[nod][j];
if(val[nod][v] == f[nod][v] || viz[v]) continue;
viz[v]=1;
cd[++cd[0]]=v;
r[v]=nod;
}
}
return viz[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
int i,nod,flow,min,a,b,c;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
val[a][b]+=c;
roads[a].push_back(b);
roads[b].push_back(a);
}
for(flow=0;BFS();)
for(i=0;i<roads[n].size();i++)
{
nod=roads[n][i];
if( f[nod][n] == val[nod][n] || !viz[nod] ) continue;
r[n]=nod;
min=inf;
for(nod=n;nod!=1;nod=r[nod])
min=mins(min,val[r[nod]][nod] - f[r[nod]][nod]);
if(min==0)
continue;
for(nod=n;nod!=1;nod=r[nod])
{
f[r[nod]][nod]+=min;
f[nod][r[nod]]-=min;
}
flow+=min;
}
printf("%d",flow);
return 0;
}