Pagini recente » Cod sursa (job #391820) | Cod sursa (job #2846230) | Cod sursa (job #2512055) | Cod sursa (job #975805) | Cod sursa (job #431013)
Cod sursa(job #431013)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
#define PB push_back
#define NM 1005
#define inf 1000000000
int C[NM][NM],F[NM][NM],FAT[NM],cd[NM],N,M;
char viz[NM];
vector<int> G[NM];
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 a,b,c;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&N,&M);
for(int i=1;i<=M;++i)
{
scanf("%d %d %d",&a,&b,&c);
G[a].PB(b);
G[b].PB(a);
C[a][b]+=c;
}
int flux=0;
while(DF())
{
for(int j=0;j<G[N].size();++j)
{
FAT[N]=G[N][j];
int nod=N;
int pump=inf;
while(FAT[nod])
{
int fat=FAT[nod];
pump=min(pump,C[fat][nod]-F[fat][nod]);
if(!pump) break;
nod=fat;
}
if(!pump) continue;
nod=N;
while(FAT[nod])
{
int fat=FAT[nod];
F[fat][nod]+=pump;
F[nod][fat]-=pump;
nod=fat;
}
flux+=pump;
}
}
printf("%d",flux);
return 0;
}