struct Edge{
int next, to;
Edge(){};
Edge(int next, int to): next(next), to(to){};
}edge[maxm*2];
int head[maxn], W[maxn], cnt;
void add(int u, int v, int w){
edge[++cnt] = Edge(head[u], v);
head[u] = cnt;
W[cnt] = w;
}
int dfs(int u, int flow){ //u表示当前节点,flow表示当前流到x的残量
if(u == ed)
return flow;
int tmp = 0; //tmp表示u节点总共流出的流量
for(int i=head[u]; ~i; i=edge[i].next){ //for(int& i=cur[u]; ~i; i=edge[i].next)当前弧优化
int v = edge[i].to;
if(dep[v]==dep[u]+1 && W[i]>0){
int di = dfs(v, min(flow, W[i]); //di表示当前边流出的流量
W[i] -= di;
W[i^1] += di;
flow -= di;
tmp += di;
if(!flow) return tmp; //流到u的流量流完了
}
}
if(flow) dep[u] = -1; //这一轮有残量,则下一轮不到u
return tmp;
}
bool bfs(){
queue<int> Q;
memset(dep, 0, sizeof(dep));
Q.push(st);
dep[st] = 1;
while(!Q.empty()){
int u = Q.front();
Q.pop();
for(int i=head[u]; ~i; i=edge[i].next){
int v = edge[i].to;
if(W[i]>0 && !dep[v]){
dep[v] = dep[u]+1;
Q.push(v);
}
}
}
if(dep[ed] == 0)
return false;
return true;
}
int dinic(){
int ans;
while(bfs()){
//for(int i=1; i<=n; ++i) 当前弧优化(两行)
// cur[i] = head[i];
while(int d=dfs(st, INF))
ans += d;
}
}
return ans;
}
抄了假的模板,一直tle,当前弧优化后可A,改用另一种模板可A,此外注意输入
63ms
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define mms(x) memset(x, 0, sizeof(x))
using namespace std;
const int maxn = 205, maxm = 5e4, INF = 1e9;
struct Edge{
int nxt, to;
Edge() {};
Edge(int nxt, int to): nxt(nxt), to(to) {};
}edge[maxm];
int head[maxn], cnt, W[maxm], dep[maxn], cur[maxn];
int st, ed;
void add(int u, int v, int w){
edge[++ cnt] = Edge(head[u], v);
head[u] = cnt;
W[cnt] = w;
}
bool bfs(){
queue<int> q;
mms(dep);
dep[st] = 1;
q.push(st);
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=head[u]; ~i; i=edge[i].nxt){
int v = edge[i].to;
if(W[i]>0 && !dep[v]){
dep[v] = dep[u]+1;
q.push(v);
}
// printf("u:%d v:%d dep:%d\n", u, v, dep[v]);
}
}
if(!dep[ed])
return false;
return true;
}
int dfs(int u, int flow){
if(u == ed)
return flow;
int tmp = 0;
for(int& i=cur[u]; ~i; i=edge[i].nxt){
int v = edge[i].to;
if(dep[v] == dep[u]+1 && W[i]){
int di = dfs(v, min(flow, W[i]));
W[i] -= di;
W[i^1] += di;
flow -= di;
tmp += di;
if(!flow) return tmp;
}
}
if(flow) dep[u] = -1;
return tmp;
}
int Dinic(){
int ans = 0;
while(bfs()){
for(int i=0; i<=ed; ++i)
cur[i] = head[i];
while(int d=dfs(st, INF))
ans += d;
// printf("#%d\n", ans);
}
return ans;
}
int main()
{
int n, np, nc, m;
while(~scanf("%d%d%d%d", &n, &np, &nc, &m)){
memset(head, -1, sizeof(head));
cnt = -1;
int u, v, w;
char ch;
for(int i=0; i<m; ++i){
scanf(" (%d,%d)%d", &u, &v, &w);
add(u, v, w);
add(v, u, 0);
}
st = n;
for(int i=0; i<np; ++i){
scanf(" (%d)%d", &v, &w);
add(st, v, w);
add(v, st, 0);
}
ed = n+1;
for(int i=0; i<nc; ++i){
scanf(" (%d)%d", &u, &w);
add(u, ed, w);
add(ed, u, 0);
}
printf("%d\n", Dinic());
}
return 0;
}