Pagini recente » Cod sursa (job #2380038) | Cod sursa (job #1676621) | Cod sursa (job #2423412) | Cod sursa (job #2423419) | Cod sursa (job #2423415)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int flux[10005],pred[1005][2],viz[1005],cap[10005];
vector <pair<int,int> > graf[1005];
int D,f;
int DFS(int node)
{
int lim,i,vecin,muchie,val;
viz[node]=1;
lim=graf[node].size();
for(i=0;i<lim;i++)
{
vecin=graf[node][i].first;
muchie=graf[node][i].second;
if(viz[vecin]==0 && flux[muchie]<cap[muchie])
{
val=DFS(vecin);
if(val)
{
pred[vecin][0]=node;
pred[vecin][1]=muchie;
if(val<cap[muchie]-flux[muchie])
return val;
else
return cap[muchie]-flux[muchie];
}
}
}
if(node!=D)
return 0;
else
return f;
}
int main()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int N,M,i,j,x,y,c,S,val,node,muchie,Flux=0;
in>>N>>M;
S=1;
D=N;
for(i=1;i<=M;i++)
{
in>>x>>y>>c;
if(y==D)
f+=c;
cap[i]=c;
cap[i+M]=0;
graf[x].push_back(make_pair(y,i));
if(y!=S)
graf[y].push_back(make_pair(x,M+i));
}
while(val=DFS(S))
{
node=D;
while(node!=S)
{
muchie=pred[node][1];
flux[muchie]+=val;
flux[muchie+M]-=val;
node=pred[node][0];
}
Flux+=val;
for(i=1;i<=N;i++)
viz[i]=0;
}
out<<Flux;
return 0;
}