为什么我的EK过了,dinic却T了
查看原帖
为什么我的EK过了,dinic却T了
521283
wangif424楼主2023/7/26 11:37
#include<bits/stdc++.h>
#define int long long
#define mp make_pair
#define ENDL putchar('\n');
#define SPACE putchar(' ');
#define P(x) put(x)
#define R(x) x=read()
using namespace std;
inline int read(){
	register int r=0,f=1;register char c=getchar();
	while(c>'9'||c<'0'){
		if(!(c^'-'))f=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0'){
		r=(r<<3)+(r<<1)+(c^'0');
		c=getchar();
	}
	return r*f;
}
inline void put(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		put(x/10);
		x%=10;
	}
	putchar(x^('0'));
	return;
}
int n,q,p;
int fir[11451],len=1;
struct b{
	int to,nxt,w;
}v[114514];
void add(int x,int y,int w){
//	P(x);putchar('-');putchar('>');put(y);
//	ENDL
	++len;
	v[len].to=y;
	v[len].nxt=fir[x];
	v[len].w=w;
	fir[x]=len;
	return;
}
int s,t;
int c;
const int inf=1e17;
struct DINIC{
	int d[114514]
	   ,fir2[11451];//当前弧优化 
	int bfs(){
		queue<int> q;
		q.push(s);
		memset(d,-1,sizeof(d));
		d[s]=1;
		while(!q.empty()){
			int nq=q.front();q.pop();
	//		P(nq);SPACE
			if(nq==t)break;
			for(int i=fir2[nq];i;fir2[nq]=i=v[i].nxt){
				if(v[i].w<=0)continue;
				d[v[i].to]=d[nq]+1;
				q.push(v[i].to);
			}
		}
	//	ENDL
		return d[t]^(-1);
	}
	int dfs(int u,int val){
		if(u==t||!val)return val;
		int tmp=0;
		for(int i=fir2[u];i;fir2[u]=i=v[i].nxt){
			if((d[v[i].to]^(1+d[u]))||v[i].w<=0)continue;
			int cut=dfs(v[i].to,min(val,v[i].w));
			v[i].w-=cut;
			v[i^1].w+=cut;
			val-=cut;
			tmp+=cut;
			if(!val)break;
		}
		if(!tmp)d[u]=-1;
		return tmp;
	}

	int dinic(){
		int mincut=0;
		memcpy(fir2,fir,sizeof(fir));
		while(bfs()){
			memcpy(fir2,fir,sizeof(fir));
			mincut+=dfs(s,inf);
			memcpy(fir2,fir,sizeof(fir));
		}
		return mincut;
	}	
}_dinic_;
struct EK{
	int lst[114514],f[114514];
	int bfs(){
		queue<int> q;
		q.push(s);
		memset(lst,-1,sizeof(lst));
		f[s]=inf;
		while(!q.empty()){
			int nq=q.front();q.pop();
			if(nq==t)break;
			for(int i=fir[nq];i;i=v[i].nxt){
				if((lst[v[i].to]^(-1))||v[i].w<=0)continue;
				q.push(v[i].to);
				lst[v[i].to]=i;
				f[v[i].to]=min(f[nq],v[i].w);
			}
		}
		return lst[t]^(-1);
	}
	int ek(){
		int mincut=0;
		while(bfs()){
			for(int i=t;i^s;i=v[lst[i]^1].to){
				v[lst[i]].w-=f[t];
				v[lst[i]^1].w+=f[t];
			}
			mincut+=f[t];
		}
		return mincut;
	}
}_ek_;
signed main(){
	R(n);R(p);R(q);
	s=2*n+p+1+q;
	t=s+1;
	for(int i=1;i<=n;i++){//客人:我裂 
		add(i,i+n,1);
		add(i+n,i,0);
	}
	for(int i=1;i<=p;i++){//源点连房间 
		add(s,2*n+i,1);
		add(2*n+i,s,0);
	}
	for(int i=1;i<=q;i++){//饭菜连汇点 
		add(t,2*n+p+i,0);
		add(2*n+p+i,t,1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=p;j++){//房间连客人 
			R(c);
			if(!c)continue;	
			add(2*n+j,i,1);
			add(i,2*n+j,0);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=q;j++){//客人连饭菜 
			R(c);
			if(!c)continue;	
			add(i+n,2*n+p+j,1);
			add(2*n+p+j,i+n,0);
		}
	}
//	P(_dinic_.dinic()); 
	P(_ek_.ek());
	return 0;
}

dinic提交记录

EK提交记录

2023/7/26 11:37
加载中...