Pagini recente » Cod sursa (job #468148) | Cod sursa (job #2242863) | Cod sursa (job #2676622) | Cod sursa (job #2274213) | Cod sursa (job #430997)
Cod sursa(job #430997)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
#define NM 1005
#define PB push_back
#define inf 1000000000
#define maxbuf 65536
vector<int> G[NM];
int C[NM][NM],F[NM][NM],FAT[NM];
char viz[NM];
int cd[NM],N,M;
FILE*fin=fopen("maxflow.in","r");
char buf[maxbuf];
int ind;
inline void refbuf()
{
int ans=fread(buf,1,maxbuf,fin);
if(ans<maxbuf) buf[ans]=0;
ind=0;
}
int readnr()
{
int ans=0;
one:
while(ind < maxbuf && !isdigit(buf[ind])) ++ind;
if(ind==maxbuf)
{
refbuf();
goto one;
}
two:
while(ind< maxbuf && isdigit(buf[ind]))
{
ans=ans*10+buf[ind]-'0';
++ind;
}
if(ind==maxbuf)
{
refbuf();
goto two;
}
return ans;
}
int DF()
{
for(int i=1;i<=N;++i)
viz[i]=0;
cd[0]=1;
cd[1]=1;
viz[1]=1;
for(int i=1;i<=cd[0];++i)
{
int nod=cd[i];
for(int j=0;j<G[nod].size();++j)
{
int nnod=G[nod][j];
if(viz[nnod]) continue;
if(C[nod][nnod]-F[nod][nnod]<=0) continue;
cd[++cd[0]]=nnod;
FAT[nnod]=nod;
viz[nnod]=1;
}
}
if(viz[N]) return 1;
return 0;
}
int main()
{
int flux=0,a,b,c;
//freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
refbuf();
N=readnr();
M=readnr();
while(M--)
{
a=readnr();
b=readnr();
c=readnr();
G[a].PB(b);
G[b].PB(a);
C[a][b]+=c;
}
while(DF())
{
int pump=inf;
int nod=N;
while(FAT[nod])
{
int tata=FAT[nod];
pump=min(pump,C[tata][nod]-F[tata][nod]);
nod=tata;
}
flux+=pump;
nod=N;
while(FAT[nod])
{
int tata=FAT[nod];
F[tata][nod]+=pump;
F[nod][tata]-=pump;
nod=tata;
}
}
printf("%d",flux);
return 0;
}