Pagini recente » Cod sursa (job #11095) | Cod sursa (job #1588960) | Cod sursa (job #121815) | Cod sursa (job #1867197) | Cod sursa (job #2024296)
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
vector<int> G[1005];
int C[1005][1005];
int F[1005][1005];
int S=0,D=200;
int stq,drq,Q[1005];
bool viz[1005];
int T[1005];
bool BFS(int S,int D)
{
memset(viz,0,sizeof(viz));
viz[S]=1;
stq=drq=1;
Q[1]=S;
while(stq<=drq)
{
int nod=Q[stq++];
if(nod==D)continue;
for(auto it:G[nod])
{
if(F[nod][it]<C[nod][it]&&!viz[it])
{
T[it]=nod;
Q[++drq]=it;
viz[it]=1;
}
}
}
return viz[D];
}
int maxflow(int S,int D)
{
int flow=0;
memset(F,0,sizeof(F));
while(BFS(S,D))
{
for(auto it:G[D])
{
if(viz[it]&&C[it][D]>F[it][D])
{
int fmin=1<<30;
T[D]=it;
for(int nod=D;nod!=S;nod=T[nod])fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
if(!fmin)continue;
for(int nod=D;nod!=S;nod=T[nod]){F[T[nod]][nod]+=fmin;F[nod][T[nod]]-=fmin;}
flow+=fmin;
}
}
}
return flow;
}
int N,M;
int main()
{
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=M;i++)
{
int x,y,z;
fscanf(f,"%d%d%d",&x,&y,&z);
C[x][y]+=z;
G[x].push_back(y);
G[y].push_back(x);
}
fprintf(g,"%d",maxflow(1,N));
fclose(f);
fclose(g);
return 0;
}