Pagini recente » Cod sursa (job #263102) | Monitorul de evaluare | Cod sursa (job #1277433) | Cod sursa (job #2104766) | Cod sursa (job #386880)
Cod sursa(job #386880)
# include <fstream>
# include <iostream>
using namespace std;
int c[1003][1003], n, t[1003], fmax, v[1003], nv;
void read ()
{
int m;
ifstream fin ("maxflow.in");
fin>>n>>m;
for (;m;--m)
{
int x, y, co;
fin>>x>>y>>co;
c[x][y]=co;
if (y==n)
v[++nv]=x;
}
}
struct nod {
int info;
nod *next;};
int bfs (int s, int d)
{
nod *st, *dr, *q;
int k;
for (int i=1;i<=n;i++)
t[i]=-1;
st=dr=new nod;
st->next=NULL;
st->info=s;
t[s]=0;
while (st)
{
k=st->info;
for (int i=2;i<=n;i++)
if (c[k][i]>0 && t[i]==-1)
{
t[i]=k;
q=new nod;
q->next=NULL;
q->info=i;
dr->next=q;
dr=q;
}
q=st;
st=st->next;
delete q;
}
return 0;
}
void EK ()
{
int cmin, gata=0;
while (!gata)
{
gata=1;
bfs(1,n);
for (int j=1;j<=nv;j++)
if (c[v[j]][n]>0 &&t[v[j]]!=-1)
{
t[n]=v[j];
cmin=1000000000;
for (int i=n;t[i];i=t[i])
if (cmin>c[t[i]][i])
cmin=c[t[i]][i];
if (cmin!=1000000000)
{
gata=0;
for (int i=n;t[i];i=t[i])
{
c[t[i]][i]-=cmin;
c[i][t[i]]+=cmin;
}
fmax+=cmin;
}
}
}
}
int main ()
{
read ();
EK();
ofstream fout ("maxflow.out");
fout<<fmax;
return 0;
}