Pagini recente » Cod sursa (job #629645) | Cod sursa (job #335076) | Cod sursa (job #1773994) | Cod sursa (job #2284673) | Cod sursa (job #1640753)
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
#define nmax 1010
#define inf 0x7fffffff
using namespace std;
int n,m1;
vector<int> m[nmax];
bitset<nmax> viz;
int f[nmax][nmax],c[nmax][nmax],prec[nmax];
queue<int> q;
inline int bfs()
{
int i,crt;
for(i=1;i<=n;i++) viz[i]=0;
viz[1]=1;
q.push(1);
while(!q.empty())
{
crt=q.front(); q.pop();
if(crt!=n)
for(vector<int>::iterator it=m[crt].begin();it!=m[crt].end();it++)
if(!viz[*it] && c[crt][*it]>f[crt][*it])
{
viz[*it]=1;
prec[*it]=crt;
q.push(*it);
}
}
return viz[n];
}
int main()
{
int i,n1,n2,fl,poz;
int maxflow=inf,flow=0;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m1);
for(;m1;m1--)
{
scanf("%d%d%d",&n1,&n2,&fl);
m[n1].push_back(n2);
m[n2].push_back(n1);
c[n1][n2]=fl;
}
n1=0;
while(bfs())
for(i=0;i<m[n].size();i++)
{
prec[n]=m[n][i];
poz=n; maxflow=inf;
while(poz!=1)
{
maxflow=min(maxflow,c[prec[poz]][poz]-f[prec[poz]][poz]);
poz=prec[poz];
}
poz=n;
while(poz!=1)
{
f[poz][prec[poz]]-=maxflow;
f[prec[poz]][poz]+=maxflow;
poz=prec[poz];
}
flow+=maxflow;
}
printf("%d\n",flow);
fclose(stdin);
fclose(stdout);
return 0;
}