先说说正解
值得一提的是,x的选择是有讲究的
再说说非正解
#include <bits/stdc++.h>
using namespace std;
const int maxn=2009;
const int inf=1e9;
int t,n,m,s;
struct edge{
int u,to,nxt,flow;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v,int flow){
d[++cnt]=(edge){u,v,head[u],flow},head[u]=cnt;
d[++cnt]=(edge){v,u,head[v],0},head[v]=cnt;
}
int dis[maxn];
bool bfs(int s,int t)
{
for(int i=0;i<=n;i++) dis[i]=0;
queue<int>q; q.push(s); dis[s]=1;
while( !q.empty() )
{
int u=q.front(); q.pop();
for(int i=head[u];i;i=d[i].nxt )
{
int v=d[i].to;
if( d[i].flow&&dis[v]==0 )
{
dis[v]=dis[u]+1;
if( v==t ) return true;
q.push(v);
}
}
}
return false;
}
int dinic(int u,int t,int flow)
{
if( u==t ) return flow;
int res=flow;
for(int i=head[u];i&&res;i=d[i].nxt)
{
int v=d[i].to;
if( d[i].flow&&dis[v]==dis[u]+1 )
{
int temp=dinic(v,t,min(d[i].flow,res) );
if( temp==0 ) dis[v]=0;
res-=temp;
d[i].flow-=temp,d[i^1].flow+=temp;
}
}
return flow-res;
}
int vis[maxn];
int main()
{
int T;cin >> T;
while( T-- )
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++)
{
int l,r,flow; scanf("%d%d%d",&l,&r,&flow);
add(l,r,flow);
}
int ans=0;
while( bfs(s,t) ) ans+=dinic(s,t,inf);
for(int i=2;i<=cnt;i+=2)
{
if( bfs(d[i].u,d[i].to) ) continue;
else vis[i]=1;
}
for(int i=2;i<=cnt;i+=2)
{
if( vis[i] ) d[i].flow=1,d[i^1].flow=0;
else d[i].flow=inf,d[i^1].flow=0;
}
int num=0;
while( bfs(s,t) ) num+=dinic(s,t,inf);
printf("%d\n",num);
for(int i=2;i<=cnt;i++) vis[i]=0;
for(int i=1;i<=n;i++) head[i]=0;
cnt=1;
}
}