Pagini recente » Cod sursa (job #244526) | football2 | Cod sursa (job #266344) | Cod sursa (job #158703) | Cod sursa (job #1153333)
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#define NMAX 1005
#define INF 0x3f3f3f3f
using namespace std;
vector<int> G[NMAX];
queue<int> Q;
bool viz[NMAX];
int N,M,S,D;
int P[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX];
int FLOW;
void read()
{
scanf("%d %d\n",&N,&M);
S=1;
D=N;
for (int i=1;i<=M;i++)
{
int a,b,c;
scanf("%d %d %d\n",&a,&b,&c);
G[a].push_back(b);
G[b].push_back(a);
C[a][b]=c;
}
}
int BFS()
{
Q.push(S);
for (int i=1;i<=N;i++) {viz[i]=0;P[i]=0;}
viz[S]=1;
while (!Q.empty())
{
int node=Q.front();
Q.pop();
if (node!=N)
for (int i=0;i<G[node].size();i++)
if (!viz[G[node][i]] && F[node][G[node][i]]<C[node][G[node][i]])
{
viz[G[node][i]]=1;
P[G[node][i]]=node;
Q.push(G[node][i]);
}
}
return viz[D];
}
void solve()
{
int val,node;
while (BFS())
{
for (int i=0;i<G[N].size();i++)
if(viz[G[N][i]] && F[G[N][i]][N]<C[G[N][i]][N])
{
val=INF;
node=N;
P[N]=G[N][i];
while (P[node])
{
val=min(val,C[P[node]][node]-F[P[node]][node]);
node=P[node];
}
node=N;
if (val)
while (P[node])
{
F[P[node]][node]+=val;
F[node][P[node]]-=val;
node=P[node];
}
FLOW+=val;
}
}
printf("%d\n",FLOW);
}
int main()
{
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
read();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}