开始没有注意每个regulator都有一个限制,wa了
改的时候也没有反应过来这个问题,直接在边上做的文章,显然不对
之后好好想想,一个点可以接受的power很可能是从很多条边流过来的,所以想到,这个点是有流量的,所以拆点
经验:如果每条边有流量限制的话,那么就拆点;仔细读题,挖掘隐含的点流量的条件
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int Maxn = 260;
const int inf = 99999999;
int n, m, cap[Maxn], B, D, S, E, map[Maxn][Maxn], flow[Maxn][Maxn];
int a[Maxn], p[Maxn];
int maxFlow() {
memset(flow, 0, sizeof(flow));
queue <int> q;
int f = 0;
while ( 1 ) {
q.push(S);
memset( a, 0, sizeof(a));
a[S] = inf;
while( !q.empty() ) {
int u = q.front(); q.pop();
for( int v = 0; v <= n + n + 1; ++v )
if ( !a[v] && flow[u][v] < map[u][v] ) {
a[v] = min( a[u], map[u][v] - flow[u][v] );
p[v] = u; q.push(v);
}
}
if ( a[E] == 0 ) break;
for ( int u = E; u != S; u = p[u] ) {
flow[p[u]][u] += a[E];
flow[u][p[u]] -= a[E];
}
f += a[E];
}
return f;
}
void buildMap() {
for ( int i = 0; i < m; ++i ) {
int si, ei, ci;
scanf("%d%d%d", &si, &ei, &ci);
map[si + n][ei] += ci;
}
scanf("%d%d", &B, &D);
for ( int i = 0; i < B; ++i ) {
int ei;
scanf("%d", &ei);
map[0][ei] = inf;
}
for ( int i = 0; i < D; ++i ) {
int si;
scanf("%d", &si);
map[si+n][E] = inf;
}
for ( int i = 1; i <= n; ++i ) map[i][i+n] += cap[i];
}
int main() {
while ( scanf("%d", &n ) != EOF ) {
for ( int i = 1; i <= n; ++i ) scanf("%d", cap + i);
scanf("%d", &m);
memset( map, 0, sizeof(map) );
S = 0, E = n + n + 1;
buildMap();
printf("%d\n", maxFlow());
}
}