Pagini recente » Cod sursa (job #2127590) | Cod sursa (job #1046171) | Cod sursa (job #1675886) | Cod sursa (job #302759) | Cod sursa (job #2462749)
#include <stdio.h>
#include <vector>
#include <string.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
bool vis[1024];
int p[1024];
vector<int> v[1024];
int maxCap[1024][1024];
int usedCap[1024][1024];
int q[1024];
int BF()
{
int i,tp,j,it;
memset(vis, 0, sizeof(vis));
q[0]=1;
q[1]=1;
vis[1]=1;
for(i=1;i<=q[0];i++)
{
tp= q[i];
if(tp==n) continue;
for(j=0; j<v[tp].size();++j )
{
it=v[tp][j];
if(vis[(it)]||usedCap[tp][(it)]==maxCap[tp][(it)]) continue;
// cout<<":"<<*it<<" ";
q[++q[0]]=it;
vis[it]=true;
p[it]=tp;
// cout<<"\n"<<tp<<"\n";
}
}
return vis[n];
}
long sum;
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d",&n,&m);
int i,j,k,c;
for(i=0;i<m;i++)
{
scanf("%d %d %d",&j,&k,&c);
v[j].push_back(k);
v[k].push_back(j);
maxCap[j][k]+=c;
}
int currentN,low,nod;
while(BF())
{
// cout<<low<<" done\n";
for(j=0;j<v[n].size();j++)
{
currentN= v[n][j];
if(maxCap[currentN][n]==usedCap[currentN][n]|| !vis[currentN]) continue;
p[n]=currentN;
low=INF;
for(nod=n;nod!=1;nod=p[nod])
low= min(low,maxCap[p[nod]][nod]-usedCap[p[nod]][nod]);
if(low==0) continue;
sum+=low;
for(nod=n;nod!=1;nod=p[nod])
{
usedCap[p[nod]][nod]+=low;
usedCap[nod][p[nod]]-=low;
}
}
}
printf("%ld\n",sum);
}