模板题,直接上网络流ISAP板子。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define clear(A, X) memset (A, X, sizeof A)
#define copy(A, B) memcpy (A, B, sizeof A)
using namespace std;
const int maxE = 4000005*2;
const int maxN = 1000008;
const int maxQ = 1000000;
const long long oo = 0x3f3f3f3f3f;
struct Edge {
int v;
long long c;
int n;
} edge[maxE];
int adj[maxN], cntE;//Ç°ÏòÐǵıíÍ·
int Q[maxQ], head, tail;//¶ÓÁÐ
int d[maxN], cur[maxN], pre[maxN], num[maxN];
int sourse, sink, nv;
int n, m;
void addedge (int u, int v, long long c) {
edge[cntE].v = v;
edge[cntE].c = c;
edge[cntE].n = adj[u];
adj[u] = cntE++;
edge[cntE].v = u;
edge[cntE].c = 0;
edge[cntE].n = adj[v];
adj[v] = cntE++;
}
void rev_bfs () {//·´ÏòBFS±êºÅ
clear (num, 0);
clear (d, -1);//û±ê¹ýºÅÔòΪ-1
d[sink] = 0;//»ãµãĬÈÏΪ±ê¹ýºÅ
num[0] = 1;
head = tail = 0;
Q[tail++] = sink;
while (head != tail) {
int u = Q[head++];
for (int i = adj[u]; ~i; i = edge[i].n) {
int v = edge[i].v;
if (~d[v]) continue;//ÒѾ±ê¹ýºÅ
d[v] = d[u] + 1;//񈧏
Q[tail++] = v;
num[d[v]]++;
}
}
}
long long ISAP() {
copy (cur, adj);
rev_bfs ();
int u = pre[sourse] = sourse, i;
long long flow = 0;
while (d[sink] < nv) {
if (u == sink) {
long long f = oo, neck;
for (i = sourse; i != sink; i = edge[cur[i]].v) {
if (f > edge[cur[i]].c){
f = edge[cur[i]].c;
neck = i;
}
}
for (i = sourse; i != sink; i = edge[cur[i]].v) {
edge[cur[i]].c -= f;
edge[cur[i] ^ 1].c += f;
}
flow += f;
u = neck;
}
for (i = cur[u]; ~i; i = edge[i].n) if (d[edge[i].v] + 1 == d[u] && edge[i].c) break;
if (~i) {
cur[u] = i;
pre[edge[i].v] = u;
u = edge[i].v;
}
else {
if (0 == (--num[d[u]])) break;
int mind = nv;
for (i = adj[u]; ~i; i = edge[i].n) {
if (edge[i].c && mind > d[edge[i].v]) {
cur[u] = i;
mind = d[edge[i].v];
}
}
d[u] = mind + 1;
num[d[u]]++;
u = pre[u];
}
}
return flow;
}
void init () {
clear (adj, -1);
cntE = 0;
}
int main()
{
int n,m,s,t;
int u,v;
long long w;
scanf("%d%d%d%d",&n,&m,&s,&t);
init();
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
cin>>w;
addedge(u,v,w);
}
sourse = s; sink = t; nv = n;
cout<<ISAP()<<endl;
return 0;
}