Pagini recente » Cod sursa (job #2650814) | Cod sursa (job #2294472) | Cod sursa (job #587733) | Cod sursa (job #1574852) | Cod sursa (job #2134166)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define inf 110005
#define nmax 1005
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
vector<int>Q[nmax];
int n,m,tata[nmax],cost[nmax][nmax],costutilizat[nmax][nmax],flow,mnflow,yetnoduri[nmax],nrnoduri;
bool viz[nmax];
void read()
{
fscanf(f,"%d %d",&n,&m);
for (int i=1;i<=m;++i)
{
int a,b,c;
fscanf(f,"%d %d %d",&a,&b,&c);
Q[a].push_back(b);
Q[b].push_back(a);
cost[a][b]=c;
}
tata[1]=inf;
}
int BF()
{
memset(viz,0,sizeof(viz));
yetnoduri[1]=1;
nrnoduri=1;
for (int i=1;i<=nrnoduri;++i)
{
int nod=yetnoduri[i];
if (nod==n)
continue;
for (auto w:Q[nod])
{
if (cost[nod][w]==costutilizat[nod][w]||viz[w])
continue;
viz[w]=true;
yetnoduri[++nrnoduri]=w;
tata[w]=nod;
}
}
return viz[n];
}
void solve()
{
for (flow=0;BF();)
{
for (auto w:Q[n])
{
if (cost[w][n]==costutilizat[w][n])
continue;
mnflow=cost[w][n]-costutilizat[w][n];
for(int i=w;i!=1;i=tata[i])
mnflow=min(mnflow,cost[tata[i]][i]-costutilizat[tata[i]][i]);
if (mnflow==0)
continue;
for (int i=w;i!=1;i=tata[i])
{
costutilizat[tata[i]][i]+=mnflow;
costutilizat[i][tata[i]]-=mnflow;
}
flow+=mnflow;
}
}
fprintf(g,"%d",flow);
}
int main()
{
read();
solve();
return 0;
}