Pagini recente » Cod sursa (job #193095) | Cod sursa (job #1009559) | Cod sursa (job #1296236) | Cod sursa (job #506028) | Cod sursa (job #784770)
Cod sursa(job #784770)
#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];
int cd[NM],TT[NM],N,M,flow;
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;
}
void update()
{
int min=INF,nod=N;
while(TT[nod]!=-1)
{
if(C[TT[nod]][nod]<min)min=C[TT[nod]][nod];
nod=TT[nod];
}
nod=N; flow+=min;
while(TT[nod]!=-1)
{
C[TT[nod]][nod]-=min;
C[nod][TT[nod]]+=min;
nod=TT[nod];
}
}
bool BF()
{
int i,nod,V,ok=0;
cd[0]=cd[1]=1; TT[1]=-1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(i=1; i<=cd[0]; ++i)
{
nod=cd[i];
for(Nod p=a[nod];p;p=p->next)
{
V=p->vf;
if(!viz[V] && C[nod][V]>0)
{
if(V!=N)cd[++cd[0]]=V;
viz[V]=1;
TT[V]=nod;
}
if(viz[N]){ ok=1; update(); viz[N]=0; }
}
}
return ok;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int i,x,y,z;
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);
}
while(BF());
fout<<flow;
return 0;
}