Pagini recente » Cod sursa (job #122550) | Cod sursa (job #1378090) | Cod sursa (job #504014) | Cod sursa (job #743064) | Cod sursa (job #1119313)
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define INF 0x7fffffff
#define N_MAX 1010
#define pb push_back
using namespace std;
vector <int> list;
vector <int> G[N_MAX];
int T[N_MAX],C[N_MAX][N_MAX],F[N_MAX][N_MAX],N,Flux_Final=0;
inline int BFS(int D)
{
int ok=0;
queue <int> Q;
memset(T,0,sizeof(T));
Q.push(1); T[1]=-1;
for (; !Q.empty();Q.pop())
{
int Nod=Q.front();
for (vector <int> :: iterator it=G[Nod].begin();it!=G[Nod].end();++it)
{
int nod=*it;
if (T[nod]==0 && C[Nod][nod]>F[Nod][nod])
{
if (nod!=D) {T[nod]=Nod; Q.push(nod);}
else ok=1;
}
}
}
return ok;
}
inline void Solve(int N)
{
for (int OK=BFS(N);OK;OK=BFS(N))
for (vector<int> :: iterator it=list.begin();it!=list.end();++it)
{
int Nod=*it;
if (T[Nod]>0 && C[Nod][N]>F[Nod][N])
{
T[N]=Nod; int MIN=INF;
for (int nod=N;nod!=1;nod=T[nod])
MIN=min(MIN,C[T[nod]][nod]-F[T[nod]][nod]);
if (MIN<=0) continue;
Flux_Final+=MIN;
for (int nod=N;nod!=1;nod=T[nod])
F[T[nod]][nod]+=MIN, F[nod][T[nod]]-=MIN;
}
}
}
inline void Load_Data(int &N)
{
int M,x,y,c;
scanf("%d%d",&N,&M);
for (int i=1;i<=M;++i)
{
scanf("%d%d%d",&x,&y,&c); G[x].pb(y); C[x][y]=c;
if (y==N) list.pb(x);
}
memset(F,0,sizeof(F));
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
Load_Data(N);
Solve(N);
printf("%d\n",Flux_Final);
fclose(stdin); fclose(stdout);
return 0;
}