安定した牛の割り当て

質問の意味:n頭の牛がBスロットを見つけ、各スロットの満足度は異なります。スロットには容量制限があります。すべての牛に、満足度のギャップができるだけ少ない独自のスロットを見つけて
もらいますアイデア:二分法の回答+二者間グラフのマッチング
注:二分法答えは、上限と下限に注意を払う必要があります。この質問では、下限に0、WAに1を使用する必要があります。

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double db;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define me0(ar) memset(ar,0,sizeof ar)
#define me1(ar) memser(ar,-1,sizeof ar)
const int N=1e3+5;
int n,b;
int c[N],g[N][N],lin[N][N];
bool vis[N];
bool dfs(int p,int x,int y){
    
    
	rep(i,x,y){
    
    
		int v=g[p][i];
		if(vis[v]) continue;
		vis[v]=1;
		if(lin[v][0]<c[v]){
    
    
			lin[v][++lin[v][0]]=p;
			return 1;
		}
		rep(j,1,lin[v][0])
			if(dfs(lin[v][j],x,y)){
    
    
				lin[v][j]=p;
				return 1;
			}
	}
	return 0;
}
bool pd(int x,int y){
    
    
	me0(lin);
	rep(i,1,n){
    
    
		me0(vis);
		if(!dfs(i,x,y)) return 0;
	}
	return 1;
}
bool op(int d){
    
    
	rep(i,1,b-d)
		if(pd(i,i+d)) return 1;
	return 0;
}
int main(){
    
    
	while(cin>>n>>b){
    
    
		me0(g);
		me0(c);
		rep(i,1,n)
			rep(j,1,b) cin>>g[i][j];
		rep(i,1,b) cin>>c[i];
		int l=0,r=b,ans;
		while(l<r){
    
    
			int m=(l+r)>>1;
			if(op(m)) r=m;
			else l=m+1;
		}
		cout<<l+1<<endl;
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/u013455437/article/details/110453107