Pagini recente » Cod sursa (job #1061956) | Cod sursa (job #1843892) | Cod sursa (job #1547721) | Cod sursa (job #3201826) | Cod sursa (job #1483509)
#include <cstdio>
#include <vector>
#include <queue>
#define NMax 1010
#define inf 200000000
#define pb push_back
#define min(a,b) ((a)<(b)? (a):(b))
using namespace std;
int n,m1;
int prec[NMax], f[NMax][NMax], c[NMax][NMax];
vector<int> m[NMax];
bool viz[NMax];
queue<int> cd;
bool BFS(int p)
{
int i,poz;
for(i=1;i<=n;i++) viz[i]=false;
viz[p]=true;
cd.push(p);
while(!cd.empty())
{
poz=cd.front(); cd.pop();
if(poz!=n)
for(i=0;i<m[poz].size();i++)
if(!viz[m[poz][i]] && c[poz][m[poz][i]]>f[poz][m[poz][i]])
{
prec[m[poz][i]]=poz;
viz[m[poz][i]]=true;
cd.push(m[poz][i]);
}
}
return viz[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m1);
int i,n1,n2,cost,flow=0,newflow;
for(;m1;m1--)
{
scanf("%d%d%d",&n1,&n2,&cost);
m[n1].pb(n2);
m[n2].pb(n1);
c[n1][n2]+=cost;
}
int poz;
while(BFS(1))
for(i=0;i<m[n].size();i++)
{
prec[n]=m[n][i];
poz=n;
newflow=inf;
while(poz!=1)
{
newflow=min(newflow,c[prec[poz]][poz]-f[prec[poz]][poz]);
poz=prec[poz];
}
poz=n;
while(poz!=1)
{
f[poz][prec[poz]]-=newflow;
f[prec[poz]][poz]+=newflow;
poz=prec[poz];
}
flow+=newflow;
}
printf("%d\n",flow);
fclose(stdin);
fclose(stdout);
return 0;
}