网络流超时
  • 板块灌水区
  • 楼主xyz123
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/9/28 21:02
  • 上次更新2024/9/28 23:26:23
查看原帖
网络流超时
379926
xyz123楼主2024/9/28 21:02
#include<bits/stdc++.h>
using namespace std;
pair<int,int>a[200010];
int n,k;
const int N=45100,M=500010;
int h[N],e[M],ne[N],w[N],idx;
void add(int a,int b,int c){e[++idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx;}
int dist[N];
bool bfs(){
	for(int i=0;i<=2*n+1;i++)	dist[i]=-1;
	dist[0]=0;
	queue<int>q;
	q.push(0);
	while(q.size()){
		int t=q.front();q.pop();
		for(int i=h[t];i;i=ne[i]){
			int j=e[i];
			if(w[i]>0&&dist[j]==-1){
				dist[j]=dist[t]+1;
				q.push(j);
			}
		}
	}
	return dist[2*n+1]>=0;
}
int work[N];
int dfs(int u,int flow){
	if(u==n*2+1)	return flow;
	for(int&i=work[u];i;i=ne[i]){
		int j=e[i];
		if(w[i]<=0||dist[j]!=dist[u]+1)	continue;
		int h=dfs(j,min(flow,w[i]));
		if(h>0){
			w[i]-=h;
			w[i^1]+=h;
			return h;
		}
	}
	return 0;
}
int dinic(){
	int ans=0;
	while(bfs()){
		for(int i=0;i<=2*n+1;i++)	work[i]=h[i];
		while(1){
			int v=dfs(0,0x3f3f3f3f);
			if(v==0)	break;
			ans+=v;
		}
	}
	return ans;
}
int main(){
	//n<=2000,k<=20000
	idx=1;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)	scanf("%d%d",&a[i].first,&a[i].second);
	sort(a+1,a+k+1);
	k=unique(a+1,a+k+1)-a-1;
	random_shuffle(a+1,a+k+1);
	for(int i=1;i<=k;i++){
		add(a[i].first,a[i].second+n,1);
		add(a[i].second+n,a[i].first,0);
	}
	for(int i=1;i<=n;i++){
		add(0,i,1);add(i,0,0);
		add(i+n,n*2+1,1);add(n*2+1,i+n,0);
	}
	int ans=dinic();
	printf("%d\n",ans);
	return 0;
}
2024/9/28 21:02
加载中...