EK求调
查看原帖
EK求调
1109707
godmoo楼主2024/3/27 13:39

样例就输出 00

#include<bits/stdc++.h>
#define pb push_back
#define pin(i,j) ((i-1)*m+j+1)
#define pout(i,j) (pin(i,j)+n*m)
#define INF (int)1e9
using namespace std;
const int N=805;
const int M=2e5+5;
int n,m,s,t,d,tot=1,cnt,head[N],vis[N],pre[N];
struct Edge{int to,nxt,cap,flow;}edge[M<<1];
void add(int u,int v,int cap){
    edge[++tot]={v,head[u],cap,0};
    head[u]=tot;
    edge[++tot]={u,head[v],0,0};
    head[v]=tot;
}
bool bfs(){
	memset(vis,0,sizeof vis),vis[s]=1;
	queue<int> q;q.push(s);
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(!vis[v]&&edge[i].cap>edge[i].flow){
				vis[v]=1,pre[v]=i,q.push(v);
				if(v==t) return true;
			}
		}
	}
	return false;
}
int EK(){
	int res=0;
	while(bfs()){
		int p=INT_MAX,v=t;
		while(v!=s){
			int i=pre[v];
			p=min(p,edge[i].cap-edge[i].flow);
			v=edge[i^1].to;
		}
		res+=p,v=t;
		while(v!=s){
			int i=pre[v];
			edge[i].flow+=p;
			edge[i^1].flow-=p;
			v=edge[i^1].to;
		}
	}
	return res;
}
int main(){
	scanf("%d%d%d",&n,&m,&d);
	s=1,t=n*m*2+2;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int x;
			scanf("%1d",&x);
			if(x) add(pin(i,j),pout(i,j),x);
			if(i-d<1||i+d>n||j-d<1||j+d>n) add(pout(i,j),t,INF);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;
			scanf(" %c",&c);
			if(c=='L'){
				cnt++;
				add(s,pin(i,j),1);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			for(int k=1;k<=n;k++){
				for(int l=1;l<=m;l++){
					if(i==k&&j==l) continue; 
					if((i-k)*(i-k)+(j-l)*(j-l)<=d*d) add(pout(i,j),pin(k,l),INF);
				}
			}
		}
	}
	printf("%d",cnt-EK());
	return 0;
}
2024/3/27 13:39
加载中...