Pagini recente » Cod sursa (job #1099909) | Cod sursa (job #612855) | Cod sursa (job #2220441) | Cod sursa (job #403532) | Cod sursa (job #444666)
Cod sursa(job #444666)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
using namespace std;
const int maxn = 1005;
const int INF = 10000005;
int i , n , m , a , b , c;
int C[maxn][maxn] , F[maxn][maxn] , dad[maxn];
bool seen[maxn];
vector <int> G[maxn];
queue <int> Q;
bool BF ()
{
while (!Q.empty()) Q.pop();
Q.push(1);
memset ( seen , 0 , sizeof(seen));
seen[1] = true;
for( ; !Q.empty() ; ) {
int node = Q.front() , i;
Q.pop();
if ( node == n ) break;
for( i = 0 ; i < G[node].size() ; ++i ) {
int act = G[node][i];
if ( seen[act] == 0 && F[node][act] < C[node][act] ) {
Q.push(act);
seen[act] = 1;
dad[act] = node;
}
}
}
return seen[n];
}
int flow()
{
int result = 0;
while ( BF() ) {
int i;
for( i = 0 ; i < G[n].size() ; ++i ) {
int act = G[n][i];
if ( F[act][n] == C[act][n] || ! seen[act] ) continue ;
dad[n] = act;
int minflow = INF;
for( act = n ; act != 1 ; act = dad[act] )
minflow = min ( minflow , ( C[dad[act]][act] - F[dad[act]][act] ));
if ( minflow == 0 ) continue ;
for( act = n ; act != 1 ; act = dad[act] ) {
F[dad[act]][act] += minflow;
F[act][dad[act]] -= minflow;
}
result += minflow;
}
}
return result;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for( i = 1 ; i <= m ; ++i ) {
scanf("%d %d %d",&a,&b,&c);
G[a].pb(b);
G[b].pb(a);
C[a][b] += c;
}
printf("%d\n",flow());
return 0;
}