题目链接:
题目大意:
给出一些渠道,每个渠道有一个走向和容量,问最终汇集到溪流中的水的总量
题目分析:
裸裸的网络流的最大流,模板题
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#define MAX 207
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int s[MAX][MAX];
int d[MAX];
bool bfs ( )
{
queue<int> q;
memset ( d , -1 , sizeof ( d ) );
d[1] = 0;
q.push ( 1 );
while ( !q.empty() )
{
int v = q.front();
q.pop();
for ( int i = 1 ; i <= n ; i++ )
if ( d[i] == -1 && s[v][i] )
{
d[i] = d[v]+1;
q.push ( i );
}
}
return d[n] != -1;
}
int dfs ( int v , int cur_flow )
{
int dt = cur_flow;
if ( v == n ) return cur_flow;
for ( int i = 1 ; i <= n ; i++ )
if ( s[v][i] > 0 && d[v]+1 == d[i] )
{
int flow = dfs ( i , min ( dt , s[v][i] ) );
s[v][i] -= flow;
s[i][v] += flow;
dt -= flow;
}
return cur_flow - dt;
}
int dinic ( )
{
int cur_flow, ans = 0;
while ( bfs() )
{
while ( cur_flow = dfs ( 1 , INF ) )
ans += cur_flow;
}
return ans;
}
int main ( )
{
while ( ~scanf ( "%d%d" , &m , &n ) )
{
int u,v,c;
memset ( s , 0 , sizeof ( s ) );
while ( m-- )
{
scanf ( "%d%d%d" , &u , &v , &c );
s[u][v] += c;
}
//cout << "YES" << endl;
printf ( "%d\n" , dinic() );
}
}