Pagini recente » Cod sursa (job #590617) | Profil Caracatita_09 | Cod sursa (job #2032204) | Cod sursa (job #1090369) | Cod sursa (job #1150772)
// O(n*m*m)
#include <fstream>
#include <vector>
#include <cstring>
#define Mx 1024
using namespace std;
vector<int> Ad[Mx];
int cap[Mx][Mx], fl[Mx][Mx];
int tat[Mx], viz[Mx];
int n;
int BF()
{
int q[Mx],lq,v1,v2,i,j;
memset(viz,0,sizeof viz);
lq=1; q[lq]=1; viz[1]=1;
for (i=1;i<=lq;i++)
{
v1=q[i];
if (v1!=n)
{
for (j=0;j<(int)Ad[v1].size();j++)
{
v2=Ad[v1][j];
if (!viz[v2] && cap[v2]!=fl[v2])
{
q[++lq]=v2; viz[v2]=1; tat[v2]=v1;
}
}
}
}
return viz[n];
}
int main()
{
ifstream fi("maxflow.in"); ofstream fo("maxflow.out");
int i,j,k,m,f=0,fmin,v;
fi>>n>>m;
for (k=0;k<m;k++)
{
fi>>i>>j>>v;
Ad[i].push_back(j);
Ad[j].push_back(i);
cap[i][j]=v;
}
while (BF()>0)
for (i=0;i<(int)Ad[n].size();i++)
{
v=Ad[n][i];
if (fl[v][n] == cap[v][n] || !viz[v]) continue;
tat[n] = v;
fmin = 999999999;
for (v = n; v != 1; v = tat[v])
fmin = min(fmin, cap[ tat[v]][v] - fl[ tat[v]][v]);
if (fmin > 0)
for (v = n; v != 1; v = tat[v])
{
fl[ tat[v]][v] += fmin;
fl[v][tat[v]] -= fmin;
}
f += fmin;
}
fo << f << "\n";
return 0;
}