数据相对于 B3606 网络流1 更弱。
数据没有 hack 掉贪心增流的错误思路,建议直接从 网络流1 中调数据。
相关代码如下。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int maxn=INT_MAX;
const double INF=DBL_MAX;
struct Edge{
int to,cap,flow=0,next;
}*edge;
int n,m,s,t;
int f[50000005],wt[50000005],till,head[50000005],ts[50000005],maxflow=0;
void eadd(int u,int v,int cap){
till++;
edge[till].next=head[u];
edge[till].cap=cap;
edge[till].to=v;
head[u]=till;
}
bool pfs(){
int v;
rep(i,1,n)f[i]=-1;
queue<int>q;
f[s]=s;
q.push(s);
while(!q.empty()){
v=q.front();
q.pop();
for(int j=head[v];j;j=edge[j].next) {
if(edge[j].cap>0&&f[edge[j].to]<0){
f[edge[j].to]=v;
wt[edge[j].to]=j;
if(edge[j].to==t)return true;
q.push(edge[j].to);
}
}
}
return false;
}
void augs(int ss,int tt){
int v=tt;
int d=maxn;
do {
int w=wt[v];
if(d>edge[w].cap)d=edge[w].cap;
v=f[v];
} while(v!=ss);
v=tt;
do {
int w=wt[v];
edge[w].cap-=d;
v=f[v];
} while(v!=ss);
maxflow+=d;
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n>>m>>s>>t;
edge=new Edge[2*m+5];
for(int i=1; i<=m; i++) {
int x,y,z,c;
cin>>x>>y>>z;
eadd(x,y,z);
}
while(pfs())augs(s,t);
//int wc=findycy();
//while(wc>0)aug(wc),wc=findycy();
//int mincost=0;
cout<<maxflow;
return 0;
}