数据过弱
查看原帖
数据过弱
1032391
封禁用户楼主2024/12/28 10:58

数据相对于 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;
}
 
2024/12/28 10:58
加载中...