Pagini recente » Cod sursa (job #77856) | Cod sursa (job #993325) | Cod sursa (job #2433112) | Cod sursa (job #113042) | Cod sursa (job #395564)
Cod sursa(job #395564)
#include<stdio.h>
#include<vector>
#include<algorithm>
#define nmax 1502
using namespace std;
vector<int> g[nmax];
int c[nmax][nmax], f[nmax][nmax];
int n,m,i,j,x,y,z;
long int flow=0;
int viz[nmax], queue[nmax], sz, tata[nmax];
int BFS()
{
memset(viz, 0, sizeof(viz));
viz[1]=1;
queue[0]=1;
sz=1;
queue[1]=1;
for(i=1;i<=sz&&queue[sz]!=n;i++)
for(j=0;j<g[queue[i]].size()&&queue[sz]!=n;j++)
if(c[queue[i]][g[queue[i]][j]]>f[queue[i]][g[queue[i]][j]]&&!viz[g[queue[i]][j]])
{
viz[g[queue[i]][j]]=1;
queue[++sz]=g[queue[i]][j];
tata[g[queue[i]][j]]=queue[i];
queue[0]=sz;
}
return viz[n];
}
int min(int a, int b)
{
if(a>b)
return b;
else return a;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i=1;i<=m;i++)
{
scanf("%d %d %d", &x, &y, &z);
c[x][y]=z;
g[x].push_back(y);
g[y].push_back(x);
}
for(;BFS();)
{
int nod;
long int fmin=99999999;
for(nod=n;nod>1;nod=tata[nod])
fmin=min(fmin, c[tata[nod]][nod]-f[tata[nod]][nod]);
for(nod=n;nod>1;nod=tata[nod])
{
f[tata[nod]][nod]+=fmin;
f[nod][tata[nod]]-=fmin;
}
flow+=fmin;
}
printf("%ld\n", flow);
return 0;
}