Pagini recente » Cod sursa (job #2137948) | Cod sursa (job #587037) | Cod sursa (job #1623169) | Cod sursa (job #2013393) | Cod sursa (job #1669737)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>
#define nmax 1005
using namespace std;
int F[10001];
#define F (F + 5000)
int C[10001];
#define C (C + 5000)
inline int abs(int x)
{
if (x<0) return -x;
return x;
}
int n;
bool viz[nmax];
class muchie
{
public:
short v;int nr;
};
queue <short> q;
vector <muchie> a[nmax];
muchie t[nmax];
void bf()
{
memset(viz,0,sizeof(viz));
int x,i;muchie y;
viz[1]=1;q.push(1);
while (!q.empty())
{
x=q.front();q.pop();
if (x!=n)
{
for (i=0;i<a[x].size();i++)
{
y=a[x][i];
if ((C[y.nr]>F[y.nr])&&(!viz[y.v]))
{
q.push(y.v);
t[y.v].v=x;
t[y.v].nr=y.nr;
viz[y.v]=1;
}
}
}
}
}
int main()
{
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int m,i,x,y,z,flux=0,flm,dif;
muchie e;int nrm;
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
e.v=y;e.nr=i;
a[x].push_back(e);
e.v=x;e.nr=-i;
a[y].push_back(e);
C[i]=z;
}
do
{
bf();
for (i=0;i<a[n].size();i++)
{
x=a[n][i].v;nrm=abs(a[n][i].nr);
if (viz[x]&&F[nrm]<C[nrm])
{
t[n].v=x;t[n].nr=nrm;
flm=INT_MAX;
for (x=n;x!=1;x=t[x].v)
{
nrm=t[x].nr;
dif=C[nrm]-F[nrm];
flm=min(flm,dif);
}
for (x=n;x!=1;x=t[x].v)
{
nrm=t[x].nr;
F[nrm]+=flm;
F[-nrm]-=flm;
}
flux+=flm;
}
}
}
while (viz[n]);
g<<flux<<'\n';
f.close();
g.close();
return 0;
}