Pagini recente » Cod sursa (job #1602212) | Cod sursa (job #542935) | Cod sursa (job #1503129) | Cod sursa (job #1953558) | Cod sursa (job #784426)
Cod sursa(job #784426)
#include <fstream>
#include <cstring>
using namespace std;
const int NM = 1003;
const int INF= 0x3f3f3f3f;
typedef struct lnod{
int vf;
struct lnod *next;
}*Nod;
int C[NM][NM],F[NM][NM];
int cd[NM],TT[NM],N,M;
bool viz[NM];
Nod a[NM];
inline int min(int a,int b){ return a<b?a:b; }
void add(Nod &q,int x)
{
Nod p=new lnod;
p->vf=x;
p->next=q;
q=p;
}
bool BF()
{
int i,nod,V;
cd[0]=cd[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(i=1; i<=cd[0]; ++i)
{
nod=cd[i];
if(nod != N)
for(Nod p=a[nod];p;p=p->next)
{
V=p->vf;
if(!viz[V] && C[nod][V]!=F[nod][V])
{
viz[V]=1;
cd[++cd[0]]=V;
TT[V]=nod;
}
}
}
return viz[N];
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int i,x,y,z,flow,nod,fmin;
fin>>N>>M;
for(i=1;i<=M;++i)
{
fin>>x>>y>>z;
C[x][y]=z;
add(a[x],y);
add(a[y],x);
}
for(flow=0; BF(); )
for(Nod p=a[N];p;p=p->next)
{
nod=p->vf;
if(C[nod][N] != F[nod][N] && viz[nod])
{
TT[N]=nod; fmin=INF;
for(nod=N; nod!=1; nod=TT[nod])
fmin = min(fmin,C[ TT[nod] ][nod] - F[ TT[nod] ][nod] );
if(fmin)
{
for(nod = N; nod!=1 ; nod=TT[nod])
{
F[ TT[nod] ][nod] += fmin;
F[nod][ TT[nod] ] -= fmin;
}
flow += fmin;
}
}
}
fout<<flow;
return 0;
}