rt,可能写法有点不一样,是在教练给的思路下自己写的没看题解。轻D
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
queue<int> q;
int n,m,s,t,u,v,d;
int dis[210][210],dep[210],sum[210];
bool gap,vis[210];
long long ans=0;
void bfs(){
q.push(t);
vis[t]=1;
dep[t]=0;
sum[0]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=1;i<=n;i++)
if(!vis[i]&&dis[i][x]){
q.push(i);
vis[i]=1;
dep[i]=dep[x]+1;
sum[dep[i]]++;
}
}
}
int now[210],cnt;
void ISAP(int x,int mn){
if(gap) return;
if(x==t){
ans+=mn;
for(int i=1;i<cnt;i++)
dis[now[i]][now[i+1]]-=mn,dis[now[i+1]][now[i]]+=mn;
return;
}
for(int i=1;i<=n;i++)
if(dis[x][i]&&dep[x]>dep[i]){
now[++cnt]=i;
ISAP(i,min(mn,dis[x][i]));
if(gap) return;
now[cnt--]=0;
}
--sum[dep[x]];
if(!sum[dep[x]]){
gap=1;
return;
}
++dep[x];
++sum[dep[x]];
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&d);
dis[u][v]+=d;
}
bfs();
gap=0;
while(!gap) now[cnt=1]=s,ISAP(s,1e9);
printf("%lld\n",ans);
return 0;
}